BZOJ 3751 [NOIP2014]解方程
阿新 • • 發佈:2018-02-20
ios 篩法 ace sizeof clu char s pan true oid
題解:運用篩法的思想,%p意義下,F(x)!=0則F(x+p)!=0
多選幾個質數把F(x)!=0的篩去就可以了
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m; int ans; int vis[1000009]; int p[51]={0,30011,11261,14843,19997,21893}; int a[200][51]; void Minit(){ memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); ans=0; } char s[100009]; int main(){ scanf("%d%d",&n,&m); // for(int i=1;i<=50;++i)p[i]=10000+i; Minit(); for(int i=0;i<=n;++i){ scanf("%s",s); int len=strlen(s); for(int k=1;k<=5;++k){ if(s[0]!=‘-‘){ a[i][k]=s[0]-‘0‘; }else{ a[i][k]=0; } for(int j=1;j<len;++j){ a[i][k]=(a[i][k]*10+(s[j]-‘0‘))%p[k]; } if(s[0]==‘-‘){ a[i][k]=(-a[i][k]+p[k])%p[k]; } } } // for(int i=0;i<=n;++i)cout<<a[i][1]<<‘ ‘; // cout<<endl; for(int k=1;k<=5;++k){ for(int j=1;j<=min(p[k],m);++j){ long long fx=0; for(int i=n;i>=0;--i)fx=(fx*j+a[i][k]+p[k])%p[k]; // cout<<fx<<endl; if(fx){ for(int d=0;j+p[k]*d<=m;++d)vis[j+p[k]*d]=1; } } } for(int i=1;i<=m;++i)if(!vis[i])++ans; printf("%d\n",ans); for(int i=1;i<=m;++i)if(!vis[i])printf("%d\n",i); return 0; }
BZOJ 3751 [NOIP2014]解方程