牛客国庆集训派对Day4 F导数卷积 NTT

题意:n<=1e5

输出g(x)的各项系数

思路:我们考虑第d项的系数gd,其中gd是由n个卷积的和组成

我们考虑第i个卷积:

其中aj是i阶导数的x^j的系数 ,bj是n-i-1阶导数的x^j的系数

接下来我们算aj bj的柿子

aj=,此aj非彼aj..

bj=

将aj, b(d-j)代入到gdi的柿子里 我们有

令i=i+j ->

进一步化简->

至此两个sum之间相互独立,且都满足卷积形式,两次NTT即可

核心代码:ww[i]就是输入的f的系数,inv[i]是阶乘的逆元

//3.NTT   灵活操作  ai bi的表达式 
    for (int i=0;i<n;++i) a[i]=inv[i];
    for (int i=0;i<n;++i) b[i]=inv[i];
    for (int i=0;i<2*n;++i)c[i]=1ll*ww[i]*jc[i]%mod;
    for (int i=0;i<2*n;++i)d[i]=1ll*ww[i]*jc[i]%mod;
    //4.NTT   固定操作  ai卷积bi  
    //也就是(a0+a1x+a2x^2...)*(b0+b1x+b2x^2....)=(c0+c1x+c2x^2....),
    //其中ck=sum_{j=0...k}aj*b(k-j)
    //也就是说求sum_{i=0~n}sum_{j=0~i}aj*b(i-j)可以nlogn 求出来 
    ntt(a,1);ntt(b,1); 
    for (int i=0;i<=len;++i) a[i]=1ll*a[i]*b[i]%mod;
    ntt(a,-1);
    
    ntt(c,1);ntt(d,1); 
    for (int i=0;i<=len;++i) c[i]=1ll*c[i]*d[i]%mod;
    ntt(c,-1);
    
    //for(int i=1;i<=len;i++)printf("%d %d\n",c[i],a[i]);
    
    //5.NTT   非固定操作  计算求和表达式的答案ans  
    for (int i=0;i<=n-1;++i) printf("%lld ",1ll*c[n+i-1]*a[i]%mod);puts("");
    return 0;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值