【模拟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,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...
随机推荐
- 关于Annotation注解的理解
在编Java程序的时候,我们经常会碰到annotation.比如:@Override 我们在子类继承父类的时候,会经常用到这个annotation.它告诉编译器这个方法是override父类的方法的. ...
- Jetpack Compose What and Why, 6个问题
Jetpack Compose What and Why, 6个问题 1.这个技术出现的背景, 初衷, 要达到什么样的目标或是要解决什么样的问题. Jetpack Compose是什么? 它是一个声明 ...
- SpringBoot系列——事件发布与监听
前言 日常开发中,我们经常会碰到这样的业务场景:用户注册,注册成功后需要发送邮箱.短信提示用户,通常我们都是这样写: /** * 用户注册 */ @GetMapping("/userRegi ...
- [DB] Hadoop免密登录原理及设置
情景: 现有两台电脑bigdata111.bigdata112,bigdata111想免密码登录bigdata112 过程: 1.bigdata111生成公钥(用于加密,给别人)和私钥(用于解密,自己 ...
- curl: (35) SSL connect error
curl: (35) SSL connect error weixin_34212762 2018-02-23 20:16:23 230 收藏 文章标签: 运维 版权 阿里云的机器,昨晚githu ...
- Linux_日志管理理论概述
一.日志系统 1.kernel -->物理终端(/dev/console) --> /var/log/dmesg(系统启动时信息(包括错误信息)记录到该文件) 或者:# dmesg 或 # ...
- 043.Python线程基本介绍
一 线程的基本概念 1.1 进程和线程 进程是资源分配的最小单位 线程是计算机中调度的最小单位 进程池: 开启过多的进程并不一走提高你的效率, 如果cp负载任务过多,平均单个任务执行的效率就会低,反而 ...
- 阿里云轻量服务器价格及轻量与ECS服务器区别比较
https://yq.aliyun.com/articles/221647 摘要: 阿里云轻量应用服务器价格表及介绍,关于轻量应用服务器和ECS服务器的性能对比 阿里云轻量应用服务器是阿里云新推出的服 ...
- window location href is not a function(Day_36)
报window location href is not a function错误的解决方案: 原因: JS报错是由于写法问题或浏览器不兼容导致的,具体解决方法如下: 原来报错的写法: window. ...
- 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录
目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<数据结构与算法> 3. 专栏目录 [经典回放]多种语言系列数据结构算法 ...