【模拟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,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...
随机推荐
- 一些代码小技巧&经典代码
请说明逻辑与(&&)在下边表达式中起到的重要作用 count != 0 && sum/count 答:该表达式使用逻辑与(&&)来确保 sum/coun ...
- Windows进程间通讯(IPC)----消息队列
消息队列 windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息.这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建 ...
- 【Matlab】BASK的调试与解调仿真
索引 一.BASK的调制 1.1 曼彻斯特码 1.2 增益控制 1.3 常量求和 1.4 与载波相乘 1.5 波形预览 1.6 参数设置(参考) 二.BASK的解调 2.1 滤波 2.2 信号比较 2 ...
- MySQL字段类型最全解析
前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...
- SE_Work3_结队项目
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求:求交点个数 结对项目作业 班级:005 Sample GitHub地址 intersect 北航网盘地址 SE结队项目 1. PS ...
- setting>SSH>sessions setting>勾选ssh Keepalive[ MobaXterm】设置保持SSH连接
[ MobaXterm]设置保持SSH连接 ssh远程连接会在无操作时自动断开连接.为了保持程序运行和连接,需要设置保持连接. 1.MobaXterm如果使用了MobaXterm客户端,那么需要在设置 ...
- 基于Centos 7.4 搭建ELK整合SpringBoot日志收集
基于Centos 7.4搭建es7.12.0+logstash-7.12.0+kibana-7.12.0(ELK)整合SpringBoot日志收集 注:Skywalking和logstash可共用一个 ...
- Java反射机制详情(2)
| |目录 运行环境 Java语言的反射机制 Class中的常用方法(获得类的构造方法) Class中的常用方法(获得类的属性) Class中的常用方法(获得类的方法) 反射动态调用类的成员 1.运行 ...
- python 解析html网页
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法: 代码如下: from pyquery import PyQuery as pq 1.可加载一段HTML字符串 ...
- GO学习-(5) Go语言基础之基本数据类型
Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 基本数据类型 整型 整型 ...