[DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
来源:互联网 发布:尸者的帝国知乎 编辑:程序博客网 时间:2024/06/05 19:52
另
列出DP方程
n这么大,一看就要倍增,j很小,倍增的时候可以直接枚举
可以用NTT优化转移
复杂度
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=6010,P=998244353;int n,p,m;int f[55][N],g[55][N],h[55][N];int num,rev[N],w[2][N];inline int Pow(int x,int y){ int ret=1; for(;y;y>>=1,x=1LL*x*x%P) if(y&1) ret=1LL*ret*x%P; return ret;}inline void Pre(int n){ num=n; int g=Pow(3,(P-1)/num); w[0][0]=w[1][0]=1; for(int i=1;i<num;i++) w[0][i]=1LL*w[0][i-1]*g%P; for(int i=1;i<num;i++) w[1][i]=w[0][num-i];}inline void add(int &x,int y){ (x+=y)%=P; }inline void NTT(int *a,int n,int r){ for(int i=1;i<n;i++) if(rev[i]>i) swap(a[i],a[rev[i]]); for(int i=1;i<n;i<<=1) for(int j=0;j<n;j+=i<<1) for(int k=0;k<i;k++){ int x=a[j+k],y=1LL*a[j+k+i]*w[r][num/(i<<1)*k]%P; a[j+k]=(x+y)%P; a[j+k+i]=(x+P-y)%P; } if(!r) for(int i=0,inv=Pow(n,P-2);i<n;i++) a[i]=1LL*a[i]*inv%P;}int main(){ scanf("%d%d%d",&n,&p,&m); f[0][0]=1; for(int i=0;i<=9&&i<=m;i++) g[i%p][i]++; int M,L=0; for(M=1;M<=(m<<1);M<<=1,L++); Pre(M<<1); for(int i=1;i<M<<1;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<L); for(int t=10;n;n>>=1,t=1LL*t*t%p){ if(n&1){ for(int i=0;i<p;i++) NTT(f[i],M<<1,1),NTT(g[i],M<<1,1); for(int i=0;i<p;i++) for(int j=0;j<M<<1;j++) h[i][j]=0; for(int i=0;i<p;i++) for(int j=0;j<p;j++) for(int k=0;k<M<<1;k++) add(h[(1LL*i*t+j)%p][k],1LL*g[j][k]*f[i][k]%P); for(int i=0;i<p;i++) NTT(h[i],M<<1,0),NTT(g[i],M<<1,0); for(int i=0;i<p;i++){ for(int j=0;j<=m;j++) f[i][j]=h[i][j]; for(int j=m+1;j<M<<1;j++) f[i][j]=0; } } for(int i=0;i<p;i++) NTT(g[i],M<<1,1); for(int i=0;i<p;i++) for(int j=0;j<M<<1;j++) h[i][j]=0; for(int i=0;i<p;i++) for(int j=0;j<p;j++) for(int k=0;k<M<<1;k++) add(h[(1LL*i*t+j)%p][k],1LL*g[i][k]*g[j][k]%P); for(int i=0;i<p;i++) NTT(h[i],M<<1,0); for(int i=0;i<p;i++){ for(int j=0;j<=m;j++) g[i][j]=h[i][j]; for(int j=m+1;j<M<<1;j++) g[i][j]=0; } } for(int i=1;i<=m;i++) add(f[0][i],f[0][i-1]); for(int i=0;i<=m;i++) printf("%d ",f[0][i]); return 0;}
阅读全文
0 0
- [DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
- [倍增NTT][DP] LOJ#6059. 「2017 山东一轮集训 Day1」Sum
- [LOJ#6060][线性基]2017 山东一轮集训 Day1. Set
- [莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列
- [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
- [容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [线段树][二分图 霍尔定理]LOJ#6062 && 2017 山东一轮集训 Day2. Pair
- [计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [霍尔定理]「2017 山东一轮集训 Day2」LOJ 6062——PAIR
- [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
- [最短路 杂题] LOJ#6075. 「2017 山东一轮集训 Day6」重建
- [费用流]LOJ#6079. 「2017 山东一轮集训 Day7」养猫
- [分块 回文自动机] LOJ#6070. 「2017 山东一轮集训 Day4」基因
- loj #6062. 「2017 山东一轮集训 Day2」Pair(线段树)
- LOJ 6100 「2017 山东二轮集训 Day1」第一题
- [树的同构][二分][可并堆维护哈希] LOJ#6066 || BZOJ4928 && 2017 山东一轮集训 Day3. 第二题
- js jquery js的DOM与Jquery相互转换,js控制select的方法
- js jquery js的DOM与Jquery相互转换,js控制select的方法
- Linux串口(serial、uart)驱动程序设计
- Java常见面试题总结
- QQ第三方登录实现
- [DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
- javaScript之数组去重
- 第一天的博客
- jquery table 鼠标选中单元格效果
- 自定义GridView添加头视图和足视图
- HTML 速查列表
- vtk处理外部事件
- 分布式框架简介SSM组合+ springmvc+mybatis+shiro+restful+bootstrap
- [bzoj3060]Tour de Byteotia