【TJOI2019】唱、跳、rap和篮球(DP)(容斥)
传送门
题解:
在洛谷看到一群O(n3)O(n^3)O(n3)AC的在嘲讽O(n2logn)O(n^2\log n)O(n2logn)的。。。
但是实际上这道题有严格O(n2)O(n^2)O(n2)的解法。。。
首先考虑容斥,计算出队伍里面至少有iii组同学在讨论 [数据删除] 的方案数进行容斥。
发现是个卷积,于是非常愉快可以O(n2logn)O(n^2\log n)O(n2logn)上一个NTT。
但是跑得没有O(n3)O(n^3)O(n3)快非常尴尬。
那么我们的想法其实很显然,考虑在前面已经确定了jjj个位置的同学来讨论 [数据删除],剩下的位置全部未定,那么显然方案数就是四个EGF的乘积展开后总次数为mmm的项之和,其中mmm是未定位置数量。
我们可以看做是(x+y+z+w)m(x+y+z+w)^m(x+y+z+w)m,其中xxx的次数不超过aaa,yyy的次数不超过bbb,zzz的次数不超过ccc,www的次数不超过ddd的,所有玩意的系数之和。
考虑二项式展开两次,发现是一个组合数的区间和,直接维护即可。
那么确定有jjj个位置的同学在讨论 [数据删除] 的方案数可以直接来一个背包DP,设f[i][j][0/1/2/3]f[i][j][0/1/2/3]f[i][j][0/1/2/3]表示前面iii个位置已经确定了jjj组同学讨论 [数据删除],最后一组的开头在j,j−1,j−2,≤j−3j,j-1,j-2,\leq j-3j,j−1,j−2,≤j−3的情况的方案数。
于是O(n2)O(n^2)O(n2)此题得到解决。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constusing std::cerr;
using std::cout;cs int mod=998244353;
inline int add(int a,int b){a+=b-mod;return a+(a>>31&mod);}
inline int dec(int a,int b){a-=b;return a+(a>>31&mod);}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}cs int N=1e3+7;int A,B,C,D,n,mx;int c[N][N],s[N][N];inline void init(){for(int re i=0;i<=n;++i){c[i][0]=s[i][0]=1;for(int re j=1;j<=i;++j)c[i][j]=add(c[i-1][j],c[i-1][j-1]),s[i][j]=add(s[i][j-1],c[i][j]);}
}inline int calc(int n,int l,int r){return dec(s[n][r],(l?s[n][l-1]:0));
}int f[N][255][4];signed main(){#ifdef zxyoifreopen("queue.in","r",stdin);
#endifscanf("%d%d%d%d%d",&n,&A,&B,&C,&D);init();mx=std::min(n>>2,std::min(std::min(A,B),std::min(C,D)));f[0][0][3]=1;for(int re i=1;i<=n;++i)for(int re j=0;j<=mx;++j){Inc(f[i][j][1],f[i-1][j][0]);Inc(f[i][j][2],f[i-1][j][1]);Inc(f[i][j][3],f[i-1][j][2]);Inc(f[i][j][3],f[i-1][j][3]);Inc(f[i][j+1][0],f[i-1][j][3]);}int ans=0;for(int re i=0;i<=mx;++i){int other=0,sum=0;other=n<4?1:add(add(f[n-3][i][0],f[n-3][i][1]),add(f[n-3][i][2],f[n-3][i][3]));int m=n-(i<<2);int A=::A-i,B=::B-i,C=::C-i,D=::D-i;for(int re j=0;j<=m;++j){int l1=std::max(0,j-A);int r1=std::min(B,j);int l2=std::max(0,m-j-C);int r2=std::min(D,m-j);if(l1>r1||l2>r2)continue;Inc(sum,mul(c[m][j],mul(calc(j,l1,r1),calc(m-j,l2,r2))));}(i&1)?Dec(ans,mul(other,sum)):Inc(ans,mul(other,sum));}cout<<ans<<"\n";return 0;
}
【TJOI2019】唱、跳、rap和篮球(DP)(容斥)相关推荐
- P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1 ...
- BZOJ2339: [HNOI2011]卡农(dp 容斥)
题意 从$1 - n$中任意选择一些数,选$m$次构成$m$个集合 保证: 集合不为空 任意两个集合不相同 集合内各个元素xor起来等于0 Sol 神仙题Orz 我看到两种做法,一种是洛谷题解上的直接 ...
- CF296B dp\容斥
传送门 文章目录 题意: 思路: 题意: n≤1e5n\le1e5n≤1e5 思路: 求方案数基本就是考虑dpdpdp了,看到nnn这么大可以考虑一下分情况讨论的dpdpdp状态. 设f[i][j]f ...
- [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...
- AT4352-[ARC101C] Ribbons on Tree【dp,容斥】
正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题 ...
- bzoj 1042: [HAOI2008]硬币购物(dp+容斥)
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2555 Solved: 1537 [Submit][St ...
- [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...
- [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)
Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...
- ARC101E Ribbons on Tree 树形dp 容斥
题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...
- bzoj 4455 [Zjoi2016]小星星 树形dp容斥
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 643 Solved: 391 [Submit][Statu ...
最新文章
- #41 最短路(分治+线性基)
- 【备忘录】Product cost collectors – 成本收集器
- jQuery中选择器加尖括号的区别
- Embedding在腾讯应用宝的推荐实践
- verilog实现步进电机脉冲分配器(三相六拍)基于Nexys4DDR开发板
- java 类型转换方法_java数据类型转换的常见方法
- mysql根据ID的顺序查找_求救:mysql 如何根据给定的 ID顺序查找结果?
- 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 语义角色标注
- Git异常:fatal: could not create work tree dir 'XXX': No such file or directory
- Oracle透明网关 for SQL Server
- 运算符重载 - C++快速入门25
- server.MapPath的相对路径问题
- SQLite异常:unsafenativemethods.sqlite3_open_interop
- Mac终端命令失效( command not found)/
- webservice框架jersey简单总结
- pandas读取excel遇见空值的处理
- 游戏外挂开发原理初探——植物大战僵尸内存挂为例
- 一文探究数据仓库体系(2.7万字建议收藏)
- C++新特性28_线程同步问题的产生原因(高级语言转为低级语言执行,时间片交替运行多线程中代码,代码切换过程中出现的问题)
- uview Cell 单元格 右侧箭头偏小