Description
Input
Output
Sample Input
Sample Output
题解:
这个题目本来是很难的,但因为数据很水,所以就很容易水过去了。
首先我们要使得f(x)==0,那么f(x)mod 任何数都必定是0,那么我们可以选择合适的质数,对f(x)取模,那么不包含这个质因子的所有所有数都会被我们排除,所以我们可以多尝试选出很多个质数进行检查,wa的几率就十分小了。
然后为了算出f(x),我们必须写一个大整数取模,讲取模之后的预处理出来。然后可以用秦九韶算法来求表达式的值,这样复杂度就对了。
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #include <vector> #define MAXN 101000 #define MAXNm 1000000 #define ll long long #define mod 100000000007 using namespace std; char ch[MAXN]; ll a[200]; int ans[MAXNm],f[MAXNm],num=0,n,m; bool check(int x){ ll sum=0; for(int i=n;i>=0;i--){ sum=(sum*x+a[i])%mod; } if(sum==0) return 1; return 0; } void init(){ scanf("%d%d",&n,&m); for(int i=0;i<=n;i++){ scanf("%s",ch+1);int len=strlen(ch+1); for(int j=1;j<=len;j++){ if(ch[j]==45) {f[i]=1;continue;} a[i]=(a[i]*10+ch[j]-‘0‘)%mod; } if(f[i]==1) a[i]*=-1; } for(int x=1;x<=m;x++){ if(check(x)) ans[++num]=x; } printf("%d\n",num); for(int i=1;i<=num;i++) printf("%d\n",ans[i]); } int main() { init(); return 0; }
时间: 2024-09-29 19:30:54