- 题目链接:http://codeforces.com/contest/1011/problem/E
- 题意:给你一个数k,以及n个十进制数,要求出在k进制下,在这n个数中任取任意个某数或某些数相加,可能的最后的一位数字有哪几种。
- 算法:数论,找规律
- 思路:现将这n个数全部转换成k进制,对k取余,即可得其最后一位数。接下来只需要对这些取余后的数操作即可,之前的不影响。可以发现,设某数值为a,任意个a的和在k进制下能形成的尾数为a与k的最大公因数的倍数。则找出取余后的n个数与k的最大公因数x,则x在k内的倍数即为所有可能出现的尾数。
#include <bits/stdc++.h>
#define pi acos(-1)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 100000 + 10;
const int mod = 1e9 + 7;
int a[maxn];
int gcd(int a, int b)
{
return b?gcd(b, a%b):a;
}
int main()
{
int n, k;
scanf("%d%d", &n, &k);
int tmp = k;
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
a[i] %= k;
tmp = gcd(tmp, a[i]);
}
printf("%d\n", k/tmp);
for(int i=0; i*tmp<k; i++){
printf("%d%c", i*tmp, " \n"[i==k/tmp]);
}
}