【NOIP2014】解方程
阿新 • • 發佈:2017-09-29
必須 log 大整數 math cnblogs () ini include har
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; }
【NOIP2014】解方程