Tyvj4876:骰子游戏 ((FFT/NTT)+倍增+DP)
来源:互联网 发布:免费下载淘宝旺旺 编辑:程序博客网 时间:2024/06/16 02:22
题目传送门:http://tyvj.cn/p/4879
题目分析:其实这题我并没有AC(因为我没写过NTT),只是觉得这还是道不错的DP,就记录一下。骗访问量
读完题之后可以发现第一段话是废话,令x减去小A手中y点数的个数,问题就变成了:有n个人,每个人有m个骰子,所有点数为y的骰子的个数大于等于x的方案有多少种?考虑到一个人手中的骰子为{1,1,2}和{1,2,1}视作同一种方案,不妨先预处理出一个人手中点数为y的骰子数为i的方案数g[i]。由于骰子的具体点数并没有卵用,我们可以等价地将y看成6。根据DP的常见套路,我们规定每个人手中的骰子从左到右点数单调不降,记h[i][j]表示考虑到第i个骰子,其点数为j的方案数,则有:
然后就是维护一个f[i][j]表示考虑完前i个人,点数为y的骰子数有j个的方案数,如果一个一个人去考虑,那么
(然而我是暴力卷积的,因为我虽然看过FFT的资料,但还没有系统地刷过题,计划会在NOIP之后学吧,好像整个机房就我还没写过FFT QAQ。如果想要AC代码,可以看神犇tututu的题解)
CODE(70pt):
#include<iostream>#include<string>#include<cstring>#include<cmath>#include<cstdio>#include<cstdlib>#include<stdio.h>#include<algorithm>using namespace std;const int maxn=405;const int maxl=70;const long long M=998244353;typedef long long LL;LL h[maxn][5];LL g[maxn];LL f[maxl][maxn*maxn];int cur=-1;int n,m,x,y;void Work(int a){ if (!a) { ++cur; f[cur][0]=1; return; } int b=a>>1; Work(b); ++cur; b=b*m; for (int i=0; i<=b; i++) for (int j=0; j<=b; j++) { f[cur][i+j]+=(f[cur-1][i]*f[cur-1][j]%M); if (f[cur][i+j]>=M) f[cur][i+j]-=M; } if (a&1) { b<<=1; ++cur; for (int i=0; i<=b; i++) for (int j=0; j<=m; j++) { f[cur][i+j]+=(f[cur-1][i]*g[j]%M); if (f[cur][i+j]>=M) f[cur][i+j]-=M; } }}int main(){ freopen("game.in","r",stdin); freopen("game.out","w",stdout); scanf("%d%d%d%d",&n,&m,&x,&y); for (int i=1; i<=m; i++) { int a; scanf("%d",&a); if (a==y) x--; } for (int i=0; i<5; i++) h[1][i]=1; for (int i=2; i<=m; i++) for (int j=0; j<5; j++) for (int k=0; k<=j; k++) { h[i][j]+=h[i-1][k]; if (h[i][j]>=M) h[i][j]-=M; } for (int i=0; i<m; i++) for (int j=0; j<5; j++) { g[i]+=h[m-i][j]; if (g[i]>=M) g[i]-=M; } g[m]=1; Work(n); LL sum=0; for (int i=max(0,x); i<=n*m; i++) { sum+=f[cur][i]; if (sum>=M) sum-=M; } printf("%lld\n",sum); return 0;}
阅读全文
0 0
- Tyvj4876:骰子游戏 ((FFT/NTT)+倍增+DP)
- Tyvj4879(dp+倍增+NTT)
- FFT&NTT(草稿)
- fft & ntt
- FFT-NTT
- fft/ntt
- 【UOJ#34】 多项式乘法(FFT && NTT)
- FFT/NTT 总结(HDU 4656)
- 初识FFT和NTT
- BZOJ2179【FFT】【NTT】
- [UOJ34]FFT && NTT 模板
- FFT、NTT小结
- FFT,NTT学习笔记
- FFT及NTT模板
- hiho1388 FFT/NTT
- FFT & NTT学习心得
- FFT&&FWT&&NTT
- HDU4609 NTT||FFT
- 网页前端代码存档
- 服务器安装之--nmon
- 序列化和反序列化Serializable-2
- Android开发能用上的技术
- BZOJ 1385: [Baltic2000]Division expression
- Tyvj4876:骰子游戏 ((FFT/NTT)+倍增+DP)
- Gradle配置记录
- 协议
- 【安全牛学习笔记】手动漏洞挖掘-SQL注入XSS-简介、跨站脚本检测和常见的攻击利用手段
- Nginx安装与部署
- Java中对XML格式数据的四种解析方式,代码示例解析
- php 关闭页面加载缓存
- 开发中遇到的IE兼容-导航栏地址不支持中文搜索
- spring启动过程之源码跟踪(上)--spring Debug