题目梗概
给出一个一元n次多项式,求出1-m的整数解。
系数a<=|10^10000|
思考
拿到题目,你可能会想到秦九韶算法。但是系数a[i]怎么处理呢?
思考了好久,看了下题解。发现只要取模就可以了,为什么呢?
$a_{0}+a_{1} \times x + a_{2} \times x^2 + a_{3} \times x^3 \cdots \cdots +a_{n} \times x^n = 0$
$\left (a_{0}+a_{1} \times x + a_{2} \times x^2 + a_{3} \times x^3 \cdots \cdots +a_{n} \times x^n \right ) \% MOD = 0 \% MOD$
$\left (a_{0}\% MOD+a_{1} \times x \% MOD + a_{2} \times x^2 \% MOD + a_{3} \times x^3 \% MOD \cdots \cdots +a_{n} \times x^n \% MOD \right ) \% MOD = 0 \% MOD$
MOD应为一个大质数,如果是合数的话有几率出现问题。 比如(2%4+2%4)%4=0%4 但实际上(2+2)!=0
读入的时候一边读入一边模,同时用秦九韶算法验证即可。
#include <algorithm> #include <cstdio> #include <cstring> typedef long long ll; const ll maxn = 1e6+100; const ll MOD = 1e9+7; ll a[110],n,m,ans[maxn],cnt; //读入 ll read(){ ll sum = 0,flag=1; char c = getchar(); while(c < '0' || c > '9'){ if( c == '-' ) flag = -1; c = getchar(); } while(c>='0' && c<='9'){ sum = sum * 10 + c - '0'; sum %= MOD; c = getchar(); } return sum*flag; } //秦九韶算法 ll Run(ll x){ ll sum = 0; for(register ll i=n+1;i>=1;i--){ sum = sum * x + a[i]; sum %= MOD; } return sum; } int main(){ n = read(); m = read(); for(ll i=1;i<=n+1;i++){ a[i] = read(); } for(register ll i=1;i<=m;i++){ if(Run(i)==0) ans[++cnt] = i; } printf("%lld\n",cnt); for(int i=1;i<=cnt;i++) printf("%lld\n",ans[i]); return 0; }