據大佬的說法這種大力亂搞題出在除NOIp之外的任何比賽都是很好的然而就是被出在了NOIpgit
首先對於想直接上高精的同窗,我仍是祝你好運吧。算法
咱們考慮一個十分顯然的性質,若\(a=b\),則對於任一天然數\(k\)都有\(a\ mod\ k=b\ mod\ k\)spa
因此咱們考慮一下把這個等式轉換成膜意義下的。code
實際上就是對於那一個方程,咱們取得一個值\(x\)時,計算其膜某個數的值,若爲\(0\)則能夠認定它有機率爲正確的答案。get
那麼取什麼值呢,根據正常人的經驗,咱們取一個大質數能夠比較合理的保證均衡。it
可是爲了保證正確性,咱們取兩個值,同時也有一個小trick,這個具體看CODE吧。io
關於那個求多項式的就不用我說了吧,一個秦九昭算法套上去就行了class
CODE經驗
#include<cstdio> #include<cctype> using namespace std; const int N=105,M=1e6+5,p1=99991,p2=1e9+7; int a1[N],a2[N],n,m,ans[M],cnt; bool vis[M]; inline char tc(void) { static char fl[100000],*A=fl,*B=fl; return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) { x=0; char ch; while (!isdigit(ch=tc())); while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); } inline void getnum(int id) { a1[id]=a2[id]=0; char ch; int flag=1; while (!isdigit(ch=tc())) flag=ch^'-'?1:-1; while (a1[id]=(10LL*a1[id]+ch-'0')%p1,a2[id]=(10LL*a2[id]+ch-'0')%p2,isdigit(ch=tc())); a1[id]*=flag; a2[id]*=flag; } inline void write(int x) { if (x>9) write(x/10); putchar(x%10+'0'); } inline bool check(int *a,int x,int mod) { register int i; int res=0; for (i=n;i>=0;--i) res=1LL*(res+a[i])*x%mod; return !res; } int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); register int i,j; read(n); read(m); for (i=0;i<=n;++i) getnum(i); for (i=1;i<=p1;++i)if (!vis[i]) if (check(a1,i,p1)) for (j=i;j<=m;j+=p1) check(a2,j,p2)&&(vis[j]=1); for (i=1;i<=m;++i) vis[i]&&(ans[++cnt]=i); for (write(cnt),putchar('\n'),i=1;i<=cnt;++i) write(ans[i]),putchar('\n'); return 0; }