放在了考试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) (容斥)的更多相关文章

  1. 8.9 NOIP模拟测试15 建设城市(city)+轰炸行动(bomb)+石头剪刀布(rps)

    鉴于T3的惨烈程度,我决定先来颓篇题解. T1 建设城市(city) 挡板法+容斥 m个建设队分成n组,每组必须有一个,先不考虑上限,共有 C(m-1,n-1)种方案. 有i个组是超过k个的,容斥掉 ...

  2. 建设城市(city):组合数,容斥原理

    想模一大堆人呢.考场上AC的大仙. 估计没人想给这题好好写一个题解吧,因为它的确挺简单的... 但是它对我来说一点都不简单啊!!! 至少出题人用脚写题解的时候肯定认为这道题是送分题了 容斥,枚举至少有 ...

  3. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)

    [GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...

  4. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  5. 【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)

    题意 出题人吃华 莱 士拉肚子了,心情不好,于是出了一道题面简单的难题. 共 T T T 组数据,对正整数 n n n 求 F ( n ) = ∑ i = 1 n μ 2 ( i ) i F(n)=\ ...

  6. [CSP-S模拟测试]:建设城市(city)(组合数学+容斥)

    题目传送门(内部题8) 输入格式 一行三个整数$n,m,k$. 输出格式 一行一个整数表示答案.对$998244353$取模. 样例 样例输入 3 7 3 样例输出 数据范围与提示 对于10%的数据, ...

  7. NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

    建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数 思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在t ...

  8. 2018.10.30 NOIP模拟 字胡串(单调栈+容斥)

    传送门 对于每个点,用单调栈求出它左右第一个比他大的位置. 然后对每个点O(logai)O(log_{a_i})O(logai​​)求出第一个拥有跟它不同二进制位的位置. 然后容斥一下就行了. 代码

  9. jzoj5987. 【WC2019模拟2019.1.4】仙人掌毒题 (树链剖分+概率期望+容斥)

    题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...

随机推荐

  1. Servlet-授课

    1 Servlet 1.1 Servlet概述 Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一.我们可以像学习Java基础一样,通过API来学习Ser ...

  2. [bug] redis-cli连接时出现Could not connect to Redis at 127.0.0.1:6379: Connection refused

    参考 https://www.geek-share.com/detail/2684728161.html

  3. centos国内镜像下载

    国内镜像下载 http://mirrors.aliyun.com/centos/6/isos/x86_64/ 如果需要下载centos 7 版本进入对应7的/isos/x86_64/ 选择minima ...

  4. Linux基本原则

    Bash特性 Shell shell(外壳),广义的shell可以理解为是用户的工作环境,在windows看来桌面就是一个shell,在linux看来终端就是shell 常见的shell有两种,一种是 ...

  5. 解决SSH自动断线,无响应的问题。

    解决SSH自动断线,无响应的问题. 3 Replies 在连接远程SSH服务的时候,经常会发生长时间后的断线,或者无响应(无法再键盘输入). 总体来说有两个方法: 1.依赖ssh客户端定时发送心跳. ...

  6. HAProxy与LVS综合----搭建LNMP源码编译结合HAProxy或LVS负载均衡

    实战一:实现LNMP与Keepalived.HAProxy做反向代理 框架图: 实现原理: 1.当A用户访问网站时,此时需要经过防火墙,防火墙将用户访问的IP地址处理后,如果允许访问,则就访问到HAr ...

  7. Linux——CentOS7添加/删除用户和用户组1

    Linux--CentOS7添加/删除用户和用户组 2017.05.02 19:58 23012浏览   前言 今天又重新装了centos7突然有关用户和用户组有关的命令记不清了,所以记一下,也方便你 ...

  8. 9.10 nohup:用户退出系统进程继续工作

    nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端.        无论是否将nohup命令的输出重定向到终端,输出都将写入到当前目录的nohup.out文件 ...

  9. SSH工作过程简介和SSH协议算法集简介

    SSH简介 SSH是Secure Shell(安全外壳)的简称,是一种在不安全的网络环境中,通过加密机制和认证机制,实现安全的远程访问以及文件传输等业务的网络安全协议. SSH协议采用了典型的客户端/ ...

  10. python使用多线程备份数据库

    前言:在日常服务器运维工作中,备份数据库是必不可少的,刚工作那会看到公司都是用shell脚本循环备份数据库,到现在自己学习python语言后,利用多进程多线程相关技术来实现并行备份数据库,充分利用服务 ...