题意:
给出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);
}