LuoguP2312 [NOIP2014 提高组] 解方程 - 秦九韶算法
秦九韶算法
秦九韶算法是由中国古代数学家秦九韶提出来的多项式算法,将一个一般多项式化为若干个一次多项式计算。优点很明显:不用乘方了。具体操作如下:
\[a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n
\]
\[=a_0+x(a_1+a_2x+a_3x^2+\dots+a_nx^{n-1})
\]
\[=a_0+x(a_1+x(a_2+a_3x+\dots+a_nx^{n-2}))
\]
\[\dots
\]
\[=a_0+x(a_1+x(a_2+x(\dots+x(a_{n-1}+a_nx))))
\]
可以理解成,每次把多项式非常数项的项拎出来,把 \(x\) 提出来,然后把拎出来的那些项又看作新的多项式递归下去……
LuoguP2312 [NOIP2014 提高组] 解方程
就是利用的秦九韶算法。不断带入数字验证答案是否正确。本来想写重载运算符的,但写出来错了QAQ。
code:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL P=1e9+7;
LL n,m,ans,key[1000055],A[105];
LL read(){
LL ll=0,f=1;char ch;
while(!isdigit(ch=getchar()))if(ch=='-')f=-1;
do ll=(ll*10%P+ch-'0')%P;while(isdigit(ch=getchar()));
return ll*f;
}
bool F(LL x){
LL sum=0;
for(LL i=n;i>=1;i--) sum=((A[i]+sum)%P*x)%P;
sum=(sum+A[0])%P;return !(sum);
}
signed main(){
n=read(),m=read();
for(LL i=0;i<=n;i++) A[i]=read();
bool flag=true;
for(LL i=1;i<=m;i++)
if(F(i)) flag=false,ans++,key[ans]=i;
if(flag){puts("0");return 0;}
printf("%lld\n",ans);
for(LL i=1;i<=ans;i++)
printf("%lld\n",key[i]);
return 0;
}