LINK:差分与前缀和

这道题和loj的一个人的高三楼相似。

也略有不同 先考虑前缀和:设G(x)为原式的普通型生成函数 \(F(x)=1+x+x^2+...\)

那么其实求的是 \(G(x)*(F(x))^k\)的前n项。k很大 不能直接做多项式快速幂 想直接展开系数似乎也做不到。

利用Lucas定理 \(F(x)^k\equiv F(x)^{sp+r}\equiv F(x)^{sp}*F(x)^r (mod p)\)

后面的东西再次展开\((F(x)^p)^s*F(x)^r\) 忘了一件事情为了方便设\(F(x)=1+x\)

那么显见\(((1+x)^p)^s*F(x)^r=(1+x^p)^s*F(x)^r\)

由于最后求出前n项 所以上式等价于\(F(x)^r\)

其实这里取的\(F(x)\)有点特殊了实际上\(F(x)=\frac{1}{1-x}\)也是一样的。

对于差分也同理 所以可以使k直接对mod取模。

其实根据上式还可以反向证明Lucas定理 这里不再赘述。

考虑如何求出系数 可以使用多项式快速幂 也可以选择EXP那一套 当然最直观的是第i项系数为\(C(i+k-1,k-1)\)可以直接线性递推得到。

差分同理 至此问题得到解决。

code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-8
#define sq sqrt
#define S second
#define F first
#define mod 1004535809
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=((ll)x*10+ch-'0')%mod;ch=getc();}
return x*f;
}
const int MAXN=300010,G=3;
int n,k,T,lim;
int a[MAXN],rev[MAXN];
int b[MAXN],O[MAXN],in[MAXN];
inline int ksm(int b,int p)
{
int cnt=1;
while(p)
{
if(p&1)cnt=(ll)cnt*b%mod;
b=(ll)b*b%mod;p=p>>1;
}
return cnt;
}
inline void NTT(int *a,int op)
{
vep(0,lim,i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int len=2;len<=lim;len=len<<1)
{
int mid=len>>1;
int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
vep(1,mid,i)O[i]=(ll)O[i-1]*wn%mod;
for(int j=0;j<lim;j+=len)
{
vep(0,mid,i)
{
int x=a[i+j],y=(ll)a[i+j+mid]*O[i]%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
}
}
}
if(op==-1)
{
int INV=ksm(lim,mod-2);
vep(0,lim,i)a[i]=(ll)a[i]*INV%mod;
}
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(k);get(T);O[0]=1;
vep(0,n,i)get(a[i]);
if(T==0)
{
in[1]=b[0]=1;b[1]=k;
vep(2,n,i)
{
in[i]=(ll)in[mod%i]*(mod-mod/i)%mod;
b[i]=(ll)b[i-1]*in[i]%mod*(i+k-1)%mod;
}
}
else
{
in[1]=b[0]=1;b[1]=mod-k;
rep(2,min(k,n-1),i)
{
in[i]=(ll)in[mod%i]*(mod-mod/i)%mod;
b[i]=mod-(ll)b[i-1]*in[i]%mod*(k-i+1)%mod;
}
}
lim=1;while(lim<n+n)lim=lim<<1;
vep(0,lim,i)rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
NTT(a,1);NTT(b,1);
vep(0,lim,i)a[i]=(ll)a[i]*b[i]%mod;
NTT(a,-1);
vep(0,n,i)printf("%d ",a[i]);
return 0;
}

最新文章

  1. 如何离线下载Chrome的安装包
  2. Spring 数据库配置用户名和密码加密
  3. 【wikioi】1281 Xn数列(矩阵乘法)
  4. jquery validate.addMethod 正则表达式
  5. Java内存模型(JMM)
  6. 使用 Linux 终端 SSH 登录 VPS
  7. Adobe Edge Animate –可重复使用的个性化按钮制作
  8. jquery直接获取html页面元素
  9. Flume NG中的Kafka Channel
  10. ARCGIS二维三维导航
  11. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
  12. 不是技术牛人,如何拿到国内IT巨头的Offer(转)
  13. textarea的换行符处理以及正确的在Html中显示
  14. 基于VRML的虚拟校园漫游系统
  15. 在sourceinsight中添加快速注释 Ctrl+/
  16. linux同一客户端多个git账号的配置
  17. 前端编程工具WebStorm 10 工具的快捷使用方式
  18. .NET资料之-根据两点经纬度计算直线距离
  19. The 15th UESTC Programming Contest Preliminary J - Jermutat1on cdoj1567
  20. day5-os、sys模块

热门文章

  1. 微信h5页面下拉露出网页来源的解决办法
  2. js实现json格式化,以及json校验工具的简单实现
  3. web前端工程化/构建自动化
  4. css两端对齐——div+css布局实现2端对齐的4种方法总结
  5. 从零开始使用 Webpack 搭建 Vue3 开发环境
  6. 数据可视化之分析篇(四)PowerBI分析模型:产品关联度分析
  7. Python之常用模块学习(一)
  8. Python函数05/内置函数/闭包
  9. Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass
  10. combogrid设置多选,并获取多选的值