Guest User

Untitled

a guest
Feb 18th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <string>
  7. using namespace std;
  8.  
  9. typedef long long LL;
  10.  
  11. const int MAXS = 10000001;
  12.  
  13. int n;
  14. string s;
  15. LL divs[1000000];
  16. int pp[1000000];
  17. int cnt;
  18. int nprime[MAXS];
  19. LL primes[MAXS];
  20. int pcnt = 0;
  21. LL ans[1000000];
  22. int anscnt;
  23.  
  24. LL gcd(LL a, LL b)
  25. {
  26.     while (b)
  27.     {
  28.         LL b1 = a % b;
  29.         a = b;
  30.         b = b1;
  31.     }
  32.     return a;
  33. }
  34.  
  35. void sieve()
  36. {
  37.     nprime[0] = 1;
  38.     primes[pcnt++] = 1;
  39.     for (int i = 2; i < MAXS; ++i)
  40.         if (!nprime[i])
  41.         {
  42.             for (int j = (i << 1); j < MAXS; j += i)
  43.                 nprime[j] = 1;
  44.             primes[pcnt++] = i;
  45.         }
  46. }
  47.  
  48. LL solve()
  49. {
  50.     int cnt[256];
  51.     memset(cnt, 0, sizeof(cnt));
  52.     for (int i = 0; i < s.size(); ++i)
  53.         ++cnt[s[i]];
  54.     int diff = 0;
  55.     for (int i = 0; i < 256; ++i)
  56.         diff += (cnt[i] != 0);
  57.  
  58.     LL masks[15];
  59.     int diff1 = diff;
  60.     for (int i = 0; i < s.size(); ++i)
  61.     {
  62.         if (!cnt[s[i]]) continue;
  63.         LL res = 1;
  64.         for (int j = i + 1; j < s.size(); ++j)
  65.         {
  66.             res *= 10;
  67.             if (s[j] == s[i])
  68.                 res += 1;
  69.         }
  70.         masks[--diff1] = res;
  71.         cnt[s[i]] = 0;
  72.     }
  73.  
  74.  
  75.     LL ret = 0;
  76.     if (diff < 10)
  77.         for (int i = 0; i < diff; ++i)
  78.             ret = gcd(ret, masks[i]);
  79.  
  80.     for (int i = 0; i < diff; ++i)
  81.         for (int j = i + 1; j < diff; ++j)
  82.             ret = gcd(ret, abs(masks[j] - masks[i]));
  83.  
  84.     return ret;
  85. }
  86.  
  87. void gen(int pos, LL m)
  88. {
  89.     if (pos == cnt)
  90.     {
  91.         ans[anscnt++] = m;
  92.         return;
  93.     }
  94.     for (int i = 0; i <= pp[pos]; ++i)
  95.     {
  96.         gen(pos + 1, m);
  97.         m *= divs[pos];
  98.     }  
  99. }
  100.  
  101. int main()
  102. {
  103.     #ifdef DEBUG
  104.     freopen("in", "r", stdin);
  105.     freopen("out", "w", stdout);
  106.     #endif
  107.  
  108.     sieve();
  109.  
  110.     scanf("%d", &n);
  111.     for (int i = 1; i <= n; ++i)
  112.     {
  113.         cin >> s;
  114.         printf("Case %d: ", i);
  115.         LL g = solve();
  116.         cnt = 0;
  117.         for (int i = 1; i < pcnt && primes[i] * primes[i] <= g; ++i)
  118.         {
  119.             if (g % primes[i] == 0)
  120.             {
  121.                 int p = 0;
  122.                 do {
  123.                     g /= primes[i];
  124.                     ++p;
  125.                 } while (g % primes[i] == 0);
  126.                 pp[cnt] = p;
  127.                 divs[cnt++] = primes[i];
  128.             }
  129.         }
  130.         if (g != 1)
  131.         {
  132.             pp[cnt] = 1;
  133.             divs[cnt++] = g;
  134.         }
  135.  
  136.         anscnt = 0;
  137.         gen(0, 1);
  138.         sort(ans, ans + anscnt);
  139.         for (int j = 0; j < anscnt; ++j)
  140.             cout << ans[j] << ' ';
  141.  
  142.         puts("");
  143.     }
  144.  
  145.     return 0;
  146. }
Add Comment
Please, Sign In to add comment