标签:
神题不可言会。
f(x+p)=f(x)(mod p)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxl 10050 #define maxn 105 using namespace std; int n,m,num[maxn][maxl],prime[]={0,5003,11261,19997,22877,21893},a[maxn],flag[maxn],ans[maxl*100],cnt=0; char s[maxl]; bool vis[6][25000]; void solve(int x) { for (int i=0;i<=n;i++) { int data=0; for (int j=1;j<=num[i][0];j++) data=(data*10+num[i][j])%prime[x]; a[i]=data; if (flag[i]) a[i]=-a[i]; } vis[x][0]=true; for (int i=1;i<=prime[x]-1;i++) { int data=a[n]*i%prime[x]; for (int j=n-1;j>=0;j--) data=(data+a[j])*i%prime[x]; if (data==0) vis[x][i]=true; } } int main() { memset(flag,false,sizeof(flag)); scanf("%d%d",&n,&m); for (int i=0;i<=n;i++) { scanf("%s",s); if (s[0]==‘-‘) { flag[i]=true; int len=strlen(s);num[i][0]=len-1; for (int j=1;j<=len-1;j++) num[i][j]=s[j]-‘0‘; } else { int len=strlen(s);num[i][0]=len; for (int j=0;j<=len-1;j++) num[i][j+1]=s[j]-‘0‘; } } for (int i=1;i<=5;i++) solve(i); for (int i=1;i<=m;i++) { bool now=true; for (int j=1;j<=5;j++) now&=vis[j][i%prime[j]]; if (now) ans[++cnt]=i; } printf("%d\n",cnt); for (int i=1;i<=cnt;i++) printf("%d\n",ans[i]); return 0; }
标签:
原文地址:http://www.cnblogs.com/ziliuziliu/p/5754406.html