大意:给你n个数,要求出这n个数在k进制下可以组成的所有个位数,所有数字均以十进制给出。
思路:首先顺次求出这n个数的gcd,然后对于求出的gcd,找出它对k取余的循环节,则该循环节即是这n个数在k进制下可以组成的所有个位数,注意:0在任何情况下都是可行的(即一个数也不用)。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
bool digits[100001];
inline int gcd(int a, int b)
{
int r;
while (b)
{
r = a % b;
a = b;
b = r;
}
return a;
}
int main()
{
int n, k, banknote;
while (scanf("%d %d", &n, &k) != EOF)
{
int all_gcd;
memset(digits, 0, sizeof(digits));
scanf("%d", &all_gcd);
for (int i = 1; i < n; i++)
{
scanf("%d", &banknote);
all_gcd = gcd(all_gcd, banknote % k);
}
int cnt = 1;
digits[0] = true;
if (!digits[all_gcd % k])
{
digits[all_gcd % k] = true;
cnt++;
}
for (long long i = all_gcd * 2; i % k != all_gcd % k; i += all_gcd)
if (!digits[i % k])
{
digits[i % k] = true;
cnt++;
}
printf("%d\n", cnt);
for (int i = 0, j = 0; i < k, j < cnt; i++)
if (digits[i])
printf("%d%c", i, j++ == cnt - 1 ? '\n' : ' ');
}
return 0;
}