正题

题目链接:https://www.luogu.com.cn/problem/P5488


题目大意

求一个长度为$n$的序列的$k$阶差分/前缀和。


解题思路

先考虑前缀和怎么做
搞出来生成函数就是
\((\sum_{i=0}^na_ix^i)*(\sum_{i=0}^{\infty}x^i)^k\)

然后根据常识我们知道$(\sum_{\infty}xi)k=\sum_{\infty}\binom{i+k-1}xi$,当然也可以理解为$xi$的系数就是每次会往后跳任意格(可以是$0$),然后$k$次跳$i$步的方案数。

之后式子
\((\sum_{i=0}^na_ix^i)*(\sum_{i=0}^{\infty}\binom{i+k-1}{i}x^i)\)

直接卷就好了

然后是差分,就是
\(\frac{\sum_{i=0}^na_ix^i}{(\sum_{i=0}^{\infty}x^i)^k}\)
直接上多项式除法就好 。考虑怎么转换这个式子,我们需要用生成函数的方法了,上等比数列公式就有$(\sum_{\infty}xi)^k=\frac{1}{(1-x)^k}$

那么它的倒数就是$(1-x)^k$,上二项式定理就有$\sum_^k(-1)i\binomxi$

然后也是两个式子卷起来就好了。

然后$k$可以直接模$p$,考虑$f(k)=(\sum_\infty xi)k$那么有$f(kn)=f(k)^n$所以直接让$k$模$p$即可

时间复杂度$O(n\log n)$


\(code\)

#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll N=(1e5)*6,P=1004535809,g=3;
struct poly{
ll a[N],n;
}G,F;
ll n,k,t,inv[N],r[N];
char s[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void NTT(ll *f,ll op,ll n){
for(ll i=0;i<n;i++)
if(r[i]<i)swap(f[i],f[r[i]]);
for(ll p=2;p<=n;p<<=1){
ll len=(p>>1);
ll tmp=power(g,(P-1)/p);
if(op)tmp=power(tmp,P-2);
for(ll k=0;k<n;k+=p){
ll buf=1;
for(ll i=k;i<k+len;i++){
ll tt=buf*f[i+len]%P;
f[i+len]=(f[i]-tt+P)%P;
f[i]=(f[i]+tt)%P;
buf=buf*tmp%P;
}
}
}
if(op){
int invn=power(n,P-2);
for(int i=0;i<n;i++)
f[i]=f[i]*invn%P;
}
return;
}
void mul(poly &a,poly &b){
ll n=1;
while(n<=a.n+b.n)n<<=1;
for(ll i=0;i<n;i++)
r[i]=(r[i>>1]>>1)^((i&1)?(n>>1):0);
NTT(a.a,0,n);NTT(b.a,0,n);
for(ll i=0;i<n;i++)
a.a[i]=a.a[i]*b.a[i]%P;
NTT(a.a,1,n);
return;
}
int main()
{
scanf("%lld",&n);
scanf("%s",s);ll l=strlen(s);
scanf("%lld",&t);
for(ll i=0;i<l;i++)
k=(k*10+s[i]-'0')%P;
inv[1]=1;
for(ll i=2;i<=n;i++)
inv[i]=(P-(P/i)*inv[P%i]%P)%P;
for(ll i=0;i<n;i++)
scanf("%lld",&F.a[i]);
G.a[0]=1;
for(ll i=1;i<=n;i++){
if(!t)G.a[i]=G.a[i-1]*(i+k-1)%P*inv[i]%P;
else{
if(i>k)break;
G.a[i]=(-1)*G.a[i-1]*(k-i+1)%P*inv[i]%P;
G.a[i]=(G.a[i]+P)%P;
}
}
G.n=F.n=n;
mul(G,F);
for(ll i=0;i<n;i++)
printf("%lld ",G.a[i]);
return 0;
}

P5488-差分与前缀和【NTT,生成函数】的更多相关文章

  1. P5488 差分与前缀和 NTT Lucas定理 多项式

    LINK:差分与前缀和 这道题和loj的一个人的高三楼相似. 也略有不同 先考虑前缀和:设G(x)为原式的普通型生成函数 \(F(x)=1+x+x^2+...\) 那么其实求的是 \(G(x)*(F( ...

  2. LuoguP5488 差分与前缀和

    题意 给定一个长为\(n\)的序列\(a\),求出其\(k\)阶差分或前缀和.结果的每一项都需要对\(1004535809\)取模. 打表找规律 先看前缀和,设\(n=5\),\(k=4\),按照阶从 ...

  3. 【BZOJ】3992: [SDOI2015]序列统计 NTT+生成函数

    [题意]给定一个[0,m-1]范围内的数字集合S,从中选择n个数字(可重复)构成序列.给定x,求序列所有数字乘积%m后为x的序列方案数%1004535809.1<=n<=10^9,3< ...

  4. 牛客小白月赛5-I-区间(差分求前缀和+一次暴力统计)

    题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作: 操作一:将a[L]-a[R]内的元素都加上P 操作二:将a[L]-a[R]内的元素都 ...

  5. CF915G Coprime Arrays 莫比乌斯反演、差分、前缀和

    传送门 差分是真心人类智慧--完全不会 这么经典的式子肯定考虑莫比乌斯反演,不难得到\(b_k = \sum\limits_{i=1}^k \mu(i) \lfloor\frac{k}{i} \rfl ...

  6. 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】

    题目描述 蒟蒻Edt把这个问题交给了你 ---- 一个精通数据结构的大犇,由于是第一题,这个题没那么难.. edt 现在对于题目进行了如下的简化: 最开始的数组每个元素都是0 给出nnn,optopt ...

  7. [TJOI2019]唱、跳、rap和篮球——NTT+生成函数+容斥

    题目链接: [TJOI2019]唱.跳.rap和篮球 直接求不好求,我们考虑容斥,求出至少有$i$个聚集区间的方案数$ans_{i}$,那么最终答案就是$\sum\limits_{i=0}^{n}(- ...

  8. A - Color the ball HDU - 1556 (差分数组+前缀和)

    思路等引自博客 https://blog.csdn.net/johnwayne0317/article/details/84928568 对数组a[7]: a[0]=1; = d[0] a[1]=1; ...

  9. [CTS2019]珍珠(NTT+生成函数+组合计数+容斥)

    这题72分做法挺显然的(也是我VP的分): 对于n,D<=5000的数据,可以记录f[i][j]表示到第i次随机有j个数字未匹配的方案,直接O(nD)的DP转移即可. 对于D<=300的数 ...

随机推荐

  1. 【js】--获取开始时间 和 截止时间中间的所有时间

    1.工具函数  将[中国标准时间] 转换成 [年月日 时分秒] /* * timeStamp: 标准时间 例: 'Tue Sep 22 2020 00:00:00 GMT+0800 (中国标准时间)' ...

  2. OGNL表达式入门

    package com.scorpion.ognl; import java.util.ArrayList; import java.util.List; import ognl.Ognl; impo ...

  3. 【springboot】@Valid参数校验

    转自: https://blog.csdn.net/cp026la/article/details/86495659 扯淡: 刚开始写代码的时候对参数的校验要么不做.要么写很多类似 if( xx == ...

  4. C#设计模式---PipeLine

    一.概述 顾名思义,管道模式就像一条管道把多个对象连接起来,整体看起来就像若干个阀门嵌套在管道中,而处理逻辑就放在阀门上,如下图,需要处理的对象进入管道后,分别经过阀门一.阀门二.阀门三.阀门四,每个 ...

  5. linux下查看磁盘使用内存及清除日志内存

    1.查看磁盘内存 df -h 2.清理日志内存 echo "">catalina.out

  6. 求方程 p+q+r+s+t=pqrst 的全体自然数解(约定p<=q<=r<=s<=t)

    解:方程左右的表达式分别记为u和v. 由题设有5t>=u. 0本来是不算入自然数的,现在的趋势是把0也算作自然数. 若p=0,则v=0,为使得u=0成立,q.r.s.t都必需为0. 这样就得到方 ...

  7. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  8. Windows Server安装MySQL

    1.下载zip包 https://dev.mysql.com/downloads/file/?id=467269 2.直接解压zip包到指定路径下 3.添加环境变量 在系统变量path后面添加mysq ...

  9. Jest中Mock网络请求

    Jest中Mock网络请求 最近需要将一个比较老的库修改为TS并进行单元测试,修改为TS还能会一点,单元测试纯粹是现学现卖了,初学Jest框架,觉得在单元测试中比较麻烦的就是测试网络请求,所以记录一下 ...

  10. ASP.NET Core Web API 教程 - Project Configuration

    ASP.NET Core Web API 教程 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,我对原文进行了翻译,同时适当删减.修改了一部分内 ...