秦九韶算法
秦九韶算法可以在 O(n) 的时间内计算一个多项式的值。
考虑多项式
f(x)=i=0∑naixi
如果直接暴力:
int Sum(int x){
int ans=0;
for(int i=0;i<=n;i++){
int res=a[i];
for(int j=0;j<=i;j++)res*=x;
ans+=res;
}
return ans;
}
显然是 O(n2) 的>_<
如果用快速幂可以加速到 O(nlogn),但是还是不够快的说qwq
考虑下面这个等式:
====a0+a1x+a2x2+⋯+anxna0+x(a1+a2x+a3x2+⋯+anxn−1)a0+x(a1+x(a2+a3x+a4x⋯2+anxn−2)⋯a0+x(a1+x(a2+x(a3+⋯+x(an−1+xan))))
诶,如果我们先把 an 乘上 x,加上 an−1,再乘 x ,再加上 an−2,再乘 x ......一直这么算下去,就能算出来多项式的值qwq!
这,这是 O(n) 的qwq!
代码也很简洁:
int Sum(int x){
int ans=0;
for(int i=n;i>=1;i--){
ans+=a[i];
ans*=x;
}
ans+=a[0];
return ans;
}