『NOIP 2014』解方程
阿新 • • 發佈:2018-09-21
getc ios 解方程 space 最終 class name long pri
題目鏈接 for Luogu
題目描述
已知多項式方程:
\(a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\)
求這個方程在 \([1,m]\) 內的整數解(\(n\) 和 \(m\) 均為正整數)。
解題思路
我們對公式進行化簡(\(L_aT^ex\)警告):
? \(a_nx^n+a_{n-1}x^{n-1}+a_{n-2}x^{n-2}+\cdots+a_0\)
\(=x(a_nx^{n-1}+a_{n-1}x^{n-2}+a_{n-2}x^{n-3}+\cdots+a_1)+a2\)
\(=x(x(a_nx^{n-2}+a_{n-1}x^{n-3}+a_{n-2}x^{n-4}+\cdots+a_2)+a_1)+a2\)
\(=\cdots\)
也就是秦九韶算法,,,
我們可以用這個方法求值,但是顯然會爆炸,用高精度得T飛。
所以我們可以每次都取模,然後判斷最終答案是不是0。我們還可以多取幾個模數,保證準確性。
代碼(只能在luogu上過哦qwq)
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int mod=1000000007; const int maxn=150; int n,m,cnt=0; int a[maxn],ans[1000050]; inline void read(register int &x){ x=0; register char ch=getchar(); int f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){ x=((long long)x*10+ch-'0')%mod; ch=getchar(); } x*=f; } inline bool check(int x){ long long y=a[n]; for(register int i=n-1;i>=0;i--){ y=(y*(long long)x+a[i])%mod; } return y==0; } int main(){ scanf("%d%d",&n,&m); for(register int i=0;i<=n;i++)read(a[i]); for(register int i=1;i<=m;i++){ if(check(i))ans[++cnt]=i; } printf("%d\n",cnt); for(register int i=1;i<=cnt;i++){ printf("%d\n",ans[i]); } }
『NOIP 2014』解方程