题意:
给出n个数,求这n个数在mod k意义下通过相加能凑出多少种数。
分析:
额,其实稍微学过一点数论的人应该都会。。。
无非就是把每个给定的数aiai求一个最大公因数(最后还要和k取公因数!!!就因为这个惨遭hack。。。。)。凑出来的数一定是这个公因数g的倍数。
证明?额,不妨去看看拓欧是怎么证明的
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 100010
using namespace std;
int n,k,g;
int a[MAXN];
int gcd(int x,int y){if(y==0)return x;return gcd(y,x%y);
}
bool used[MAXN];
int main(){SF("%d%d",&n,&k);g=0;for(int i=1;i<=n;i++){SF("%d",&a[i]);a[i]%=k;g=gcd(g,a[i]);g=gcd(g,k-a[i]);}int cnt=0;for(int i=0;i<k;i+=g){if(used[i]==1)break;used[i]=1;cnt++;}PF("%d\n",cnt);for(int i=0;i<k;i++)if(used[i]==1)PF("%d ",i);
}