题面:https://www.luogu.org/problem/P2312
本题只要了解秦九昭算法就可解,即: 把一个n次多项式 f(x)=A[n]*x^n+A[n-1]*x^(n-1)+...+A[1]*X+A[0] 改写成如下形式: f(x)=(...((A[n]*x+A[n-1])*x+A[n-2])*x+...+A[1])*x+A[0] 求多项式的值时,首先计算最内层括号内一次多项式的值 然后由内向外逐层计算一次多项式的值 这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。 Code: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<ctime> using namespace std; const int N=1000005,M=105,p=1000000007; bool delta=true; int n,m,ans,len,sum=0; int a[M],solutions[N]; long long read(){ long long sum=0,minus=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-'){ minus=-1; } c=getchar(); } while(c >='0' && c <='9'){ sum=((sum*10)+c-'0')%p; c=getchar(); } return sum*minus; } void print(int x){ if(x<0){ putchar('-'); x=-x; } if(x>9){ print(x/10); } putchar(x%10+'0'); } bool calc(long long x){ sum=0; for(long long i=n;i>=1;i--){ sum=((a[i]+sum)*x)%p; } sum=(sum+a[0])%p; return sum==0; } int main(){ n=read(); m=read(); for(long long i=0;i<=n;i++){ a[i]=read(); } for(long long i=1;i<=m;i++){ if(calc(i)){ delta=false; ans++; solutions[++len]=i; } } if(delta){ print(ans); return 0; } print(ans); printf("\n"); for(long long i=1;i<=len;i++){ print(solutions[i]); printf("\n"); } return 0; }