1. 程式人生 > >【NOIP2014】解方程

【NOIP2014】解方程

必須 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】解方程