CF1817C Similar Polynomials 题解

可能更好的阅读体验

题目传送门

Div.1 C 拉格朗日差值,赛时开香槟。

UPD:有个地方打错了,已经更正。

题目大意

给定 d 次两个多项式 A(x),B(x)。求 s,使得 B(x)A(x+s)(mod109+7) ,保证 s 存在。
给出多项式的形式为给出 x=0,1,,d109+7 的值。
d2.5×107

题目解析

考虑 A(x)B(xs)(mod109+7),展开 B(xs)
发现 A(x)B(x) 最高位系数相同(记位 k),并且只要知道第二高位 k1,k2,那么就有
k1k22sk1(mod109+7)
所以关键在于求这三个数字。

考虑拉格朗日插值(考虑 xi=i,这里直接带入)

f(x)=i=0dyij=1,jinxjij

最高项系数为

i=0dyi(1)dii!(di)!

第二高项系数为

i=0dyi(1)dii!(di)!d(d+1)2

预处理 i! 逆元即可,Θ(n)

int n; ll a[maxn],b[maxn],fact[maxn],inv[maxn],k,k1,k2;
ll fpow(ll x,ll y){
ll tmp=x,res=1;
while(y){
if(y&1) res=res*tmp%MOD;
y>>=1; tmp=tmp*tmp%MOD;
} return res;
}
ll getk(int d,ll *p){
ll ans=0; int i;
for(i=0;i<=d;i++){
ll t=p[i]*inv[i]%MOD*inv[d-i]%MOD; if((d-i)&1) t=MOD-t;
ans=(ans+t)%MOD;
} return ans;
}
ll getk2(int d,ll *p){
ll ans=0; int i;
for(i=0;i<=d;i++){
ll t=(1ll*d*(d+1)/2-i)%MOD*p[i]%MOD*inv[i]%MOD*inv[d-i]%MOD; if((d-i)&1) t=MOD-t;
ans=(ans+t)%MOD;
} return MOD-ans;
}
int main(){
#ifdef LOCAL
freopen("1.in","r",stdin);
#endif
n=read(); int i; for(i=0;i<=n;i++) a[i]=read(); for(i=0;i<=n;i++) b[i]=read();
fact[0]=1; for(i=1;i<=n;i++) fact[i]=fact[i-1]*i%MOD;
inv[n]=fpow(fact[n],MOD-2); for(i=n-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%MOD;
k=getk(n,a); k1=getk2(n,a); k2=getk2(n,b);
print((k2-k1+MOD)%MOD*fpow(k*n%MOD,MOD-2)%MOD);
return 0;
}
posted @   jiangtaizhe001  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-05-02 CF1648C Tyler and Strings 题解
点击右上角即可分享
微信分享提示