【模拟8.09】建设城市(city) (容斥)
放在了考试T1
发现70分的DP很水啊,f[i][j]为当前位置是i分配了j个队的方案
我们用前缀和统计,在将i删去,j倒序枚举,就可以删掉一维(也可以滚动数组滚起来)
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 #include<string>
6 #include<algorithm>
7 #include<vector>
8 #include<map>
9 #define MAXN 110001
10 #define int long long
11 using namespace std;
12 int f[MAXN],sum[MAXN];
13 int n,m,K;
14 const int mod=998244353;
15 int ans=0;
16 signed main()
17 {
18 // freopen("text.in","r",stdin);
19 // freopen("a.out","w",stdout);
20 scanf("%lld%lld%lld",&n,&m,&K);
21 m-=n;K-=1;
22 if(m<0||K<0)
23 {
24 printf("0\n");
25 return 0;
26 }
27 f[0]=1;sum[0]=1;
28 for(int j=1;j<=m;++j)sum[j]=sum[j-1]+f[j];
29 for(int i=1;i<=n;++i)
30 {
31 for(int j=m;j>=0;--j)
32 {
33 if(j-K-1>=0)
34 f[j]=(sum[j]-sum[j-K-1]+mod)%mod;
35 else
36 f[j]=sum[j]%mod;
37 // printf("%lld f[%lld]=%lld\n",i,j,f[j]);
38 }
39 sum[0]=f[0];
40 for(int j=1;j<=m;++j)
41 {
42 sum[j]=(sum[j-1]+f[j]+mod)%mod;
43 }
44 }
45 printf("%lld\n",f[m]%mod);
46 }
47 /*
48 3 7 3
49 */
正解是容斥
每次枚举至少有i个不符合条件,很显然满足容斥定理
然后C(n,i)表示在n个城市中任选出i个不符合的
C(m-1-i*K,n-1)显然挡板法,现将i*K这一不符合条件的部分删去,然后在剩余区间中
插入n-1个板子,意味着分成n份,
又因为C(n,i)是选出不符合的i个,然后相乘,就是至少为i时的所有情况
我们发现至少为i的情况包括i+1,i+2.....的情况,
那么我们可以看出i+1的情况可以看成是在至少为i时,确定了i,又选了1个
以至少为一为例,
选了为2的情况为C(2,1)次,(2集合中的两个数都被1集合重复选过)
那么容斥一下至少为2时改为加
至于容斥更严谨的证明,可以去看别人博客,我就不证了.......
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 #include<string>
6 #include<algorithm>
7 #include<vector>
8 #include<map>
9 #define MAXN 31000001
10 #define int long long
11 using namespace std;
12 const int mod=998244353;
13 int n,m,K;
14 int ni_c[MAXN],jie[MAXN],ni[MAXN];
15 int C(int x,int y)
16 {
17 if(y>x)return 0;
18 if(y==0)return 1;
19 return jie[x]*ni_c[y]%mod*ni_c[x-y]%mod;
20 }
21 signed main()
22 {
23 scanf("%lld%lld%lld",&n,&m,&K);
24 int ans=0;
25 jie[1]=1;ni[1]=1;ni_c[1]=1;
26 jie[0]=1;ni[0]=1;ni_c[0]=1;
27 for(int i=2;i<=m+1;++i)
28 {
29 jie[i]=jie[i-1]*i%mod;
30 ni[i]=(mod-mod/i)*ni[mod%i]%mod;
31 ni_c[i]=ni_c[i-1]*ni[i]%mod;
32 }
33 ans=C(m-1,n-1)%mod;
34 int base=n;
35 for(int i=1;i<=n;++i)
36 {
37 if(m-(i*K)<n)break;
38 if((i%2)==0)
39 {
40 ans=(ans+base*C(m-1-(i*K),n-1)%mod+mod)%mod;
41 }
42 else
43 {
44 ans=(ans-base*C(m-1-(i*K),n-1)%mod+mod)%mod;
45 }
46 base=(base*(n-i)%mod)*ni[i+1]%mod;
47 }
48 printf("%lld\n",ans%mod);
49 }
【模拟8.09】建设城市(city) (容斥)的更多相关文章
- 8.9 NOIP模拟测试15 建设城市(city)+轰炸行动(bomb)+石头剪刀布(rps)
鉴于T3的惨烈程度,我决定先来颓篇题解. T1 建设城市(city) 挡板法+容斥 m个建设队分成n组,每组必须有一个,先不考虑上限,共有 C(m-1,n-1)种方案. 有i个组是超过k个的,容斥掉 ...
- 建设城市(city):组合数,容斥原理
想模一大堆人呢.考场上AC的大仙. 估计没人想给这题好好写一个题解吧,因为它的确挺简单的... 但是它对我来说一点都不简单啊!!! 至少出题人用脚写题解的时候肯定认为这道题是送分题了 容斥,枚举至少有 ...
- 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)
[GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...
- NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...
- 【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)
题意 出题人吃华 莱 士拉肚子了,心情不好,于是出了一道题面简单的难题. 共 T T T 组数据,对正整数 n n n 求 F ( n ) = ∑ i = 1 n μ 2 ( i ) i F(n)=\ ...
- [CSP-S模拟测试]:建设城市(city)(组合数学+容斥)
题目传送门(内部题8) 输入格式 一行三个整数$n,m,k$. 输出格式 一行一个整数表示答案.对$998244353$取模. 样例 样例输入 3 7 3 样例输出 数据范围与提示 对于10%的数据, ...
- NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」
建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数 思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在t ...
- 2018.10.30 NOIP模拟 字胡串(单调栈+容斥)
传送门 对于每个点,用单调栈求出它左右第一个比他大的位置. 然后对每个点O(logai)O(log_{a_i})O(logai)求出第一个拥有跟它不同二进制位的位置. 然后容斥一下就行了. 代码
- jzoj5987. 【WC2019模拟2019.1.4】仙人掌毒题 (树链剖分+概率期望+容斥)
题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...
随机推荐
- Catalan数以及相关性质的证明
\(Catalan\) 数相关证明 Mushroom 2021-5-14 \(Catalan\)数的定义 给定一个凸\(n + 1\)边形, 通过在内部不相交的对角线,把它划分成为三角形的组合,不同的 ...
- Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件
前言 前两篇文章分别讲解了JDBC和Mybatis的基本知识,以及自定义持久层框架的设计思路,从这篇文章开始,我们正式来实现一个持久层框架. 新建一个项目 首先我们新建一个maven项目,将其命名为I ...
- 改善c++程序的150个建议(读后总结)-------10-11
10. 优化结构体中元素的布局 结构体变量所占空间大小并不是其所含类型所占字节数之和,其所占内存字节数涉及到字节对齐. 字节对齐 :变量在内存中储存都是以字节数为单位,每一个字节都有自己的地址,逻辑上 ...
- Codeforces Beta Round #107(Div2)
B.Phone Numbers 思路:就是简单的结构体排序,只是这里有一个技巧,就是结构体存储的时候,直接存各种类型的电话的数量是多少就行,在读入电话的时候,既然号码是一定的,那么就直接按照格式%c读 ...
- Visual Lab Online —— Alpha版本发布声明
Visual Lab Online -- Alpha版本发布声明 项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Alpha阶段发布声明 发布声明 目录 Visual Lab Onli ...
- 技术干货 | 基于MindSpore更好的理解Focal Loss
[本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:Focal Loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失 ...
- Jekyll+GitHub Pages部署自己的静态Blog
混了这么久,一直想拥有自己的博客,通过jekyll和GitHub Pages捣腾出了自己的博客(https://www.ichochy.com) 一.安装jekyll 首先有安装Ruby的开发环境 运 ...
- 测usb读写
dd if=/dev/sda of=/dev/null bs=1M count=1000每次测完 清一下 memory cacheecho 3 > /proc/sys/vm/drop_cache ...
- Bash shell的特性
bash的特性 命令补全 Tab键 命令补全 路径补全 选项补全 yum install -y bash-completion -长格式 --all -短格式 -a 快 ...
- mysql左连接和分组实例
例: 需求:查询A表中的所有列,并查询A表中的数据(ID)在B表中出现的次数,然后按model排序,最后所有结果在一张表中展示 A表结构: B表结构: ini_device_policy表中id与in ...