Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <string>
- using namespace std;
- typedef long long LL;
- const int MAXS = 10000001;
- int n;
- string s;
- LL divs[1000000];
- int pp[1000000];
- int cnt;
- int nprime[MAXS];
- LL primes[MAXS];
- int pcnt = 0;
- LL ans[1000000];
- int anscnt;
- LL gcd(LL a, LL b)
- {
- while (b)
- {
- LL b1 = a % b;
- a = b;
- b = b1;
- }
- return a;
- }
- void sieve()
- {
- nprime[0] = 1;
- primes[pcnt++] = 1;
- for (int i = 2; i < MAXS; ++i)
- if (!nprime[i])
- {
- for (int j = (i << 1); j < MAXS; j += i)
- nprime[j] = 1;
- primes[pcnt++] = i;
- }
- }
- LL solve()
- {
- int cnt[256];
- memset(cnt, 0, sizeof(cnt));
- for (int i = 0; i < s.size(); ++i)
- ++cnt[s[i]];
- int diff = 0;
- for (int i = 0; i < 256; ++i)
- diff += (cnt[i] != 0);
- LL masks[15];
- int diff1 = diff;
- for (int i = 0; i < s.size(); ++i)
- {
- if (!cnt[s[i]]) continue;
- LL res = 1;
- for (int j = i + 1; j < s.size(); ++j)
- {
- res *= 10;
- if (s[j] == s[i])
- res += 1;
- }
- masks[--diff1] = res;
- cnt[s[i]] = 0;
- }
- LL ret = 0;
- if (diff < 10)
- for (int i = 0; i < diff; ++i)
- ret = gcd(ret, masks[i]);
- for (int i = 0; i < diff; ++i)
- for (int j = i + 1; j < diff; ++j)
- ret = gcd(ret, abs(masks[j] - masks[i]));
- return ret;
- }
- void gen(int pos, LL m)
- {
- if (pos == cnt)
- {
- ans[anscnt++] = m;
- return;
- }
- for (int i = 0; i <= pp[pos]; ++i)
- {
- gen(pos + 1, m);
- m *= divs[pos];
- }
- }
- int main()
- {
- #ifdef DEBUG
- freopen("in", "r", stdin);
- freopen("out", "w", stdout);
- #endif
- sieve();
- scanf("%d", &n);
- for (int i = 1; i <= n; ++i)
- {
- cin >> s;
- printf("Case %d: ", i);
- LL g = solve();
- cnt = 0;
- for (int i = 1; i < pcnt && primes[i] * primes[i] <= g; ++i)
- {
- if (g % primes[i] == 0)
- {
- int p = 0;
- do {
- g /= primes[i];
- ++p;
- } while (g % primes[i] == 0);
- pp[cnt] = p;
- divs[cnt++] = primes[i];
- }
- }
- if (g != 1)
- {
- pp[cnt] = 1;
- divs[cnt++] = g;
- }
- anscnt = 0;
- gen(0, 1);
- sort(ans, ans + anscnt);
- for (int j = 0; j < anscnt; ++j)
- cout << ans[j] << ' ';
- puts("");
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment