多校 HDU 6397 Character Encoding (容斥)
题意:在0~n-1个数里选m个数和为k,数字可以重复选;
如果是在m个xi>0的情况下就相当于是将k个球分割成m块,那么很明显就是隔板法插空,不能为0的条件限制下一共k-1个位置可以选择插入隔板,那么也就是说一共有C(k-1, m-1)种组合(m-1是因为要m块只要m-1个隔板);
回到这题,我们要求的并不是m个xi>0、而是xi>=0,但是隔板之间又不能为空,最少也是1,那就让m块每块都有一个球就好了,这样最少为1个的隔板间也就相当于是0个;但是此时的隔板插空处就又增加了,那么此时就变为将m+k个球分割成m块的问题,一共k+m-1个空,也就是组合数量为C(k+m-1, m-1);
这样我们就知道了在xi无限制的情况下的组合数量,但是xi很明显是有限制的,对于xi有0<=xi<n;假设有m块里有1个xi>=n的情况下,要让问题保持在xi是取自[0, n-1]的范围内,那么就让那m块里其中一块变成已经放了n个球的情况,那么我们就相当于求在k-n+m-1个位置里插上m-1个隔板的方案数C(k-1*n+m-1, m-1);但是这个一块有m个位置可以选,也就是包括刚刚插空的方案还要加上选择时的方案即一共C(m, 1)*C(k-1*n+m-1, m-1);然后我们枚举当C(m, i)的i位为0~m时的所有情况, 令(-1)^i为容斥系数。答案就是

下面给出代码加注释:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+, INF=0x3f3f3f3f, mod=;///在这里k+m在最大值是2e5所以说保存阶乘和阶乘逆的数组要开2e5
void ex_gcd(ll a, ll b, ll &d, ll &x, ll &y){
if (!b) {d = a, x = , y = ;}
else{
ex_gcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
ll Inv(ll a, ll p){
ll d, x, y;
ex_gcd(a, p, d, x, y);
return d == ? (x % p + p) % p : -;
}
ll inv[N]={, };///保存i!的逆元
ll sum[N]={, };///保存i!
ll getC(int n, int m){///得到C(n, m)
if(n<m||m<){///如果不满足这些的情况是根本没有方案数的
return ;
}
return ((sum[n]*inv[m])%mod)*inv[n-m]%mod;
}
int main( ){
register int i, n, m, k, T;
register ll l, ans;
for(l=; l<N; ++l){
sum[l]=(sum[l-]*l)%mod;
inv[l]=Inv(sum[l], mod);
}
scanf("%d", &T);
while(T--){
ans=;
scanf("%d%d%d", &n, &m, &k);
for(i=; i*n<=k; ++i){
if(i&){
ans=((ans-getC(m, i)*getC(k-i*n+m-, m-)%mod)%mod+mod)%mod;///斥
}else{
ans=(ans+getC(m, i)*getC(k-i*n+m-, m-)%mod)%mod;///容
}
}
printf("%lld\n", ans);
}
}
拙略的代码
多校 HDU 6397 Character Encoding (容斥)的更多相关文章
- HDU 6397(2018多校第8场1001) Character Encoding 容斥
听了杜教的直播后知道了怎么做,有两种方法,一种构造函数(现在太菜了,听不懂,以后再补),一种容斥原理. 知识补充1:若x1,x2,.....xn均大于等于0,则x1+x2+...+xn=k的方案数是C ...
- HDU 6397 Character Encoding (组合数学 + 容斥)
题意: 析:首先很容易可以看出来使用FFT是能够做的,但是时间上一定会TLE的,可以使用公式化简,最后能够化简到最简单的模式. 其实考虑使用组合数学,如果这个 xi 没有限制,那么就是求 x1 + x ...
- hdu 6397 Character Encoding (生成函数)
Problem Description In computer science, a character is a letter, a digit, a punctuation mark or som ...
- HDU - 6397 Character Encoding 2018 Multi-University Training Contest 8 (容斥原理)
题意:问有多少种不重复的m个数,值在[0,n-1]范围内且和为k. 分析:当k<=n-1时,肯定不会有盒子超过n,结果是C(m+k-1,k):当k>m*(n-1)时,结果是0. 剩下的情况 ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法
地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others) M ...
- 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)
题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...
- C - Visible Trees HDU - 2841 -莫比乌斯函数-容斥
C - Visible Trees HDU - 2841 思路 :被挡住的那些点(x , y)肯定是 x 与 y不互质.能够由其他坐标的倍数表示,所以就转化成了求那些点 x,y互质 也就是在 1 - ...
- HDU 5297 Y sequence 容斥 迭代
Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...
随机推荐
- facenet模型训练
做下记录,脚本如下: 对比 python3 src/compare.py ../models/-/ ../faces/pyimgs/dashenlin/ytwRkvSdG1000058.png ../ ...
- Java Queue 专题
关于java中的Queue,经常用到,做个总结 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约. (Java中的集合包括三 ...
- 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置
今天有个工作是把所有的确认按钮放在取消按钮的左边,类似于下图这样的,公司用的时antd组件 但是antd组件的按钮时确认键放在右边的 可以采用下面的方式,将按钮调换过来: 对的,就是在modal里面的 ...
- Qt——数据库编程
一.概述 Qt提供了一个类似JDBC的数据库接口,需要为每个可以连接的特定数据库提供驱动程序,可以通过 QStringList QSqlDatabase::drivers() 知道当前版本的Qt哪些驱 ...
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...
- 【转】关于在linux下清屏的几种技巧
在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...
- Group Anagrams - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Group Anagrams - LeetCode 注意点 字母都是小写的 解法 解法一:用一个字符串表示strs[i]中出现的字母,比如:abc-> ...
- Mininet 系列实验(四)
实验内容 本次实验拓扑图: 在该环境下,h0 向 h1 发送数据包,由于在 mininet 脚本中设置了连接损耗率,在传输过程中会丢失一些包,本次实验的目的是展示如何通过控制器计算路径损耗速率(h0- ...
- 前端学习 -- Css -- 伪元素
:first-letter 表示第一个字符 :first-line 表示文字的第一行 :before 选中元素的最前边,一般该伪类都会结合content一起使用,通过content可以向指定位置添加内 ...
- python之旅:python中range()和len()函数区别
函数:len() 作用:返回字符串.列表.字典.元组等长度 语法:len(str) 参数: str:要计算的字符串.列表.字典.元组等 返回值:字符串.列表.字典.元组等元素的长度 实例 1.计算字符 ...