题目链接

题意:
给你一个nnn,表示你要选出一个nnn个人组成的队列。有四种不同的人,人数分别是a,b,c,da,b,c,da,b,c,d个,保证a+b+c+d&gt;=na+b+c+d&gt;=na+b+c+d>=n。我们要求队伍里不能有连续的四个位置依次是第一种人、第二种人、第三种人和第四种人。求方案数。对998244353998244353998244353取模。n&lt;=1000,a,b,c,d&lt;=500n&lt;=1000,a,b,c,d&lt;=500n<=1000,a,b,c,d<=500

题解:
难得自己做出来道题。

首先先考虑一些暴力的dp想法。我们可能会想记录当前这四种人分别站到队伍里了多少个,然后当前已经有了这四种人中连续的几种人的方案数。很显然的是,空间和时间都不允许。

于是我们换个思路,我们直接做不好做,我们就考虑用总方案数减去不合法的方案数。我们先考虑如何求总方案数。我们设dp[i][j]dp[i][j]dp[i][j]表示考虑了前iii种人,已经占了jjj个位置的方案数。在转移时,我们并不能直接累加,因为我们在队伍里放进去若干个当前这种人的时候,位置是可以任意选的,所以要乘上一个组合数。我们设第iii种人可以用num[i]num[i]num[i]个,那么可以列出转移方程式:dp[i][j]=∑k=max(0,j−num[i])jdp[i−1][k]∗Cn−jj−kdp[i][j]=\sum_{k=max(0,j-num[i])}^{j}dp[i-1][k]*C_{n-j}^{j-k}dp[i][j]=k=max(0,j−num[i])∑j​dp[i−1][k]∗Cn−jj−k​ 这样我们就可以在O(n2)O(n^2)O(n2)的时间内算出这个总方案数了。

接下来我们考虑减去不合法的方案,我们发现可以容斥,我们用总方案数减去至少有一处出现不合法,其余位置随便放的方案数,加上至少有两处不合法,其他位置随便放的方案数,以此类推。我们已经会算xxx个位置,每种人可以用的数量已知的情况下怎么算总方案数,那么我们就考虑如何算有nnn个位置,选出kkk组连续的四个位置的方案数。这个其实也是一个经典的组合数模型,我们可以预先对于每一组放上三个,这样就变成了Cn−3∗kkC_{n-3*k}^{k}Cn−3∗kk​了。这样就可以计算出答案了。

复杂度的话,是O(n3)O(n^3)O(n3)的,实际来分析一下常数,应该会发现容斥的枚举次数上限是n/4n/4n/4,内层的话要枚举444次,每次枚举一个当前占了的位置数和上一次占了的位置数,这两个的差不超过num[i]num[i]num[i],实际常数应该是不大的。再加上时限是444秒,就这么跑过去了,而且实测的话,似乎最慢的点也不到一秒。

update:
之前的代码在BZOJ上会被卡常,新的代码减少了取模次数,是可以过的。

代码:

#include <bits/stdc++.h>
using namespace std;int n,a,b,c,d,shu[5];
const long long mod=998244353;
long long ans,dp[5][1010],C[1010][1010];
int main()
{scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);C[0][0]=1;for(int i=1;i<=n;++i){C[i][0]=1;for(int j=1;j<=i;++j)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}int mn=min(a,b);mn=min(mn,c);mn=min(mn,d);mn=min(mn,n/4);for(int i=0;i<=mn;++i){long long opt=1;if(i&1)opt=-1;memset(dp,0,sizeof(dp));shu[1]=a-i;shu[2]=b-i;shu[3]=c-i;shu[4]=d-i;for(int j=0;j<=shu[1];++j)dp[1][j]=C[n-4*i][j];for(int j=2;j<=4;++j){for(int k=0;k<=n;++k){for(int l=max(0,k-shu[j]);l<=k&&n-4*i-l>=0;++l)dp[j][k]=(dp[j][k]+dp[j-1][l]*C[n-4*i-l][k-l])%mod;}}ans=(ans+opt*dp[4][n-4*i]*C[n-3*i][i]%mod+mod)%mod;}printf("%lld\n",ans);return 0;
}

洛谷5339 BZOJ5510 TJOI2019 唱、跳、rap和篮球 容斥 dp 组合数相关推荐

  1. 洛谷P5664:Emiya 家今天的饭(容斥、dp)

    解析 应该是比较入门的容斥了 统计方案用总方案数-某列超过1半的方案数 dp设计的一个trick是只统计差值 代码 #include<bits/stdc++.h> using namesp ...

  2. 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头

    [题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...

  3. 洛谷P3349:小星星(容斥dp)

    解析 先安利一波洛谷上我介绍如何用暴力日过去的博客 现在开始务正业 考虑把dp记录状态的一维s去掉 这样单次转移复杂度变成n3n^3n3 但是这样显然会算多啊! 因为一个编号可能会用很多次 考虑容斥 ...

  4. 洛谷P2678 [NOIP2015 提高组] 跳石头

    传送门:https://www.luogu.com.cn/problem/P2678 非常同意一个观点:二分答案由二分区间和judge函数构成 二分答案,顾名思义,就是找到答案的范围区间,然后在这个区 ...

  5. 【洛谷 P5341】 [TJOI2019]甲苯先生和大中锋的字符串(后缀自动机)

    题目链接 建出\(sam\),求出parent tree上每个点的\(endpos\)集合大小. 如果等于\(k\),说明到达这个点的都可以.给\((len[fa(i)],len[i]]\)的\(cn ...

  6. 一个摄像头就能让虚拟人唱跳rap,抖音即可玩

    允中 发自 凹非寺 量子位 | 公众号 QbitAI 全身动作捕捉,现在无需昂贵的动捕设备,只要一个摄像头就能轻松实现. 并且就在抖音上,人人都能上手体验. 上面这段虚拟数字形象跳舞的视频采用了抖音直 ...

  7. 洛谷P3975【天津省选2015】(后缀自动机DP)

    题目链接 https://www.luogu.com.cn/problem/P3975 题解 此题非常经典且重要,是sam的函谷关,必须拿下. 记录每个点endpos大小的方法是在parent树从下往 ...

  8. 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4463 Prob ...

  9. 洛谷 - P4323 [JSOI2016]独特的树叶(树上哈希+换根dp)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树 A ,再给出一棵 n + 1 个节点的树 B,题目保证了树 B 是树 A 添加了一个叶子结点后的一棵树,只不过编号的顺序不同,现在问这个叶子节点 ...

  10. YBROJ洛谷P3211:XOR和路径(线性基,期望dp)

    解析 不难想到第一步利用期望线性性逐位考虑. 然后就变成求一个布尔变量的期望了,可以直接转化为求概率. 我一开始的想求从1出发异或和为0/1的概率,然而这个东西在原点1附近的转移特别别扭-老出现概率大 ...

最新文章

  1. 制造业人工智能8大应用场景
  2. Split字符串分割函数
  3. python3 线程隔离_Python并发编程之线程中的信息隔离(五)
  4. bootcmd 和bootargs
  5. delphi中TStringGrid数据的导出
  6. linux错误日志重定向,Linux shell 重定向标准错误输出
  7. Java实现身份证号码的验证,JAVA后台验证身份证号码
  8. 新冠患者样本单细胞测序文献汇总
  9. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】
  10. vscode we cannot connect_秋季常规赛分秒必争,PC BET直播:TES能否拿下西安WE
  11. [JAVA][Eclipse]JVM terminated. Exit code=13
  12. JAVA中apply方法的原理_关于学习java函数式接口Function中的apply方法的一些感悟
  13. 搭建gos_快速浏览gOS –但不要称其为Google
  14. ArcEngine符号化——文本符号
  15. wstmart知识记录
  16. 启动获取安全策略文件服务出错-tomcat
  17. PS原生支持苹果M1Mac,速度提升50%
  18. java 内部接口 内部类_Java接口/内部类
  19. php excel给excel批量插入图片
  20. 我亲爱的朋友们_亲爱的lazyweb-我该如何处理所有电子邮件?

热门文章

  1. r访问oracle数据库,R学习笔记之访问远程Oracle数据库
  2. python绘制彩色地震剖面断层解释_地震剖面上的断层分析及相关意义
  3. MATLAB中直方图均衡化和线性与非线性增强
  4. windows通过bat运行指定位置程序及设置开机自启
  5. CentOS设置SSH Key登录
  6. python带你过不一样的“清明节”和看神奇的《清明上河图》
  7. 8核、6核、4核、双核CPU是什么意思
  8. iphone屏幕圆角插件_苹果iPhone6s也能分屏?越狱新插件助你实现
  9. word硕士毕业论文不同章节设置不同页眉
  10. 硕士毕业论文页眉页脚页码设置