给你
n
个点:
直接高斯消元是 O(n3) 的。
L(x)=∑i=1nyi∏j=1,j≠inx−xjxi−xj=∑i=1nyix−x1xi−x1⋯x−xi−1xi−xi−1x−xi+1xi−xi+1⋯x−xnxi−xn
设 A(x)=∏ni=1(x−xi),Bi(x)=A(x)x−xi,Ci(x)=Bi(x)Bi(xi)
可以看出
Ci(x)=x−x1xi−x1⋯x−xi−1xi−xi−1x−xi+1xi−xi+1⋯x−xnxi−xn={1 (x=xi)0 (x=xj,j≠i)
因为当 x=xi 时每一项的分子都等于分母,当 x=xj(j≠i) 时有一项的分子为 0 。
那么
这样就可以 O(n2) 算出来了。
代码
t
个点,插出
void solve()
{
memset(c,0,sizeof c);
c[0]=1;
memset(ans,0,sizeof ans);
for(i=1;i<=t;i++)
for(j=t;j>=0;j--)
{
(c[j+1]+=c[j])%=p;
(c[j]=-c[j]*x[i])%=p;
}
for(i=1;i<=t;i++)
{
memcpy(d,c,sizeof d);
memset(b,0,sizeof b);
for(j=t;j>=0;j--)
{
b[j]=d[j+1];
d[j]=(d[j]+d[j+1]*x[i])%p;
d[j+1]=0;
}
ll s=0,px=1;
for(j=0;j<=t;j++)
{
s=(s+px*b[j])%p;
px=px*x[i]%p;
}
s=fp(s,p-2)*y[i]%p;
for(j=0;j<=t;j++)
b[j]=b[j]*s%p;
for(j=0;j<=t;j++)
ans[j]=(ans[j]+b[j])%p;
}
}
n
个点,求
void solve()
{
ll ans=0;
for(i=1;i<=n;i++)
{
ll s1=1,s2=1;
for(j=1;j<=n;j++)
if(j!=i)
{
s1=(s1*(m-x[j]))%p;
s2=(s2*(x[i]-x[j]))%p;
}
ans=(ans+y[i]*s1%p*fp(s2,p-2)%p)%p;
}
}