Luogu P2312
求 a 0 + a 1 x + a 2 x 2 + . . . + a n x n = 0 a_0+a_1x+a_2x^2+...+a_nx^n=0 a0+a1x+a2x2+...+anxn=0 在 [ 1 , m ] [1,m] [1,m]中的整数解 数据范围: n ≤ 100 , ∣ a i ∣ ≤ 1 0 10000 , m < 1 0 6 n\leq 100,|a_i|\leq 10^{10000},m<10^6 n≤100,∣ai∣≤1010000,m<106
先看题,额,暴力枚举每个x判断符合与否 再看范围。。。。 高精?真的超级不想打 细想一下, O ( n m ) O(nm) O(nm)就已经 1 0 8 10^8 108高精常数这么大随便就死翘翘啊。。。
神仙解法:对于每个 a i a_i ai用大质数取模,想一下有点道理,就跟哈希差不多,要是怕的话多来几个大质数
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=103,mod=19260817; inline int read() { int ans=0,f=1;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)) { ans=(ans*10%mod+(s&15))%mod; s=getchar(); }return ans*f; } int n,m; int a[N]; bool f(int x) { ll ans=0; for(int i=n+1;i>=1;i--) { ans=(ans*x%mod+a[i])%mod; } if(ans==0)return 1; return 0; } int z[N],p; int main() { n=read();m=read(); for(int i=1;i<=n+1;i++) a[i]=read(); for(int i=1;i<=m;i++) { if(f(i))z[++p]=i; } printf("%d\n",p); for(int i=1;i<=p;i++) printf("%d\n",z[i]); }