【模拟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,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...
随机推荐
- 基于ray的分布式机器学习(二)
基本思路:基于parameter server + multiple workers模式.同步方式:parameter server负责网络参数的统一管理,每次迭代均将参数发送给每一个worker,多 ...
- shell 脚本中常用的内置变量
在 Bash 解释器中,内置了许多变量,这些变量的功能是解释器自带的,我们在编写shell脚本时如果能灵活的使用它们,对脚本的编写效率以及差错大有帮助, 下面一一介绍这些变量 $FUNCNAME.$L ...
- Keycloak 13 自定义用户身份认证流程(User Storage SPI)
Keycloak 版本:13.0.0 介绍 Keycloak 是为现代应用程序和服务提供的一个开源的身份和访问管理的解决方案. Keycloak 在测试环境可以使用内嵌数据库,生产环境需要重新配置数据 ...
- 10.Debug
1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 Debug调式, ...
- Docker系列——Grafana+Prometheus+Node-exporter服务器监控平台(一)
在最近的博文中,都是介绍监控平台的搭建,其实并不难,主要是需要自己动手操作,实践一番就会了. 有天在想,云上的服务器,是不是也可以搭建一个监控平台,所以就捣鼓了一下,不过遗憾的是,使用阿里云开源的插件 ...
- Spring Boot读取自定义外部属性
测试的环境:Spring Boot2 + Maven +lombok 准备需要用到的基础类: public class People { private String name; private St ...
- 【转载】kvm迁移
https://www.jianshu.com/p/60132085a3c9 kvm分静态和动态迁移,静态就是关机迁移,比较简单,动态迁移就是不关闭服务器进行迁移.静态迁移:确定虚拟机关闭 https ...
- KVM虚拟化存储管理(4)
一.KVM存储虚拟化介绍 KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的. Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种型: Vol ...
- Boa Web Server 缺陷报告及其修正方法
综述 Boa 作为一种轻巧实用的 WEB 服务器广泛应用于嵌入式设备上, 但 Boa 对实现动态网页的 CGI 的支持上仍存在一些缺陷, 本文描述了 Boa 对 CGI 的 Status/Locat ...
- Java并发:ThreadLocal的简单介绍
作者:汤圆 个人博客:javalover.cc 前言 前面在线程的安全性中介绍过全局变量(成员变量)和局部变量(方法或代码块内的变量),前者在多线程中是不安全的,需要加锁等机制来确保安全,后者是线程安 ...