HDU 6397(2018多校第8场1001) Character Encoding 容斥
听了杜教的直播后知道了怎么做,有两种方法,一种构造函数(现在太菜了,听不懂,以后再补),一种容斥原理。
知识补充1:若x1,x2,.....xn均大于等于0,则x1+x2+...+xn=k的方案数是C(k+m-1,m-1)种(貌似紫书上有,记不太清了)。
知识补充2:若限制条件为n(即x1,x2....xn均小于n,假设有c个违反,则把k减掉c个n(相当于把c个超过n的数也变成大于等于0的),就可以套用知识1的公式了。
则最后的答案为sum( (-1)^c * C(m , c) * C(m-1+k-n*c , m-1) );
这个题貌似要预处理出乘法逆元,不然会TLE。我的lucas定理做法超时了。。。
借鉴了杜教链接中的代码,O(n)时间预处理:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL mod=998244353;
const int maxn=203000;
LL f[maxn],fv[maxn];//f是阶乘,fv是乘法逆元
LL quick_power(LL a,LL b){
LL ans=1;
for(;b;b>>=1){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
void init(){//初始化
f[0]=1;
for(LL i=1;i<maxn;i++)
f[i]=(f[i-1]*i)%mod;
fv[maxn-1]=quick_power(f[maxn-1],mod-2);
for(LL i=maxn-1;i>0;i--){
fv[i-1]=fv[i]*i%mod;
}
}
LL C(LL n,LL m){//这样可以O(1)计算出组合数
if(n<0||m<0||n<m)return 0;
return f[n]*(fv[m])%mod*fv[n-m]%mod;
}
int main(){
LL n,m,k,ans;
int T;
init();
scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld",&n,&m,&k);
LL ans=0;
for(int c=0;c*n<=k;c++){//容斥
if(c&1)ans=(ans-C(m,c)*C(k-c*n-1+m,m-1)%mod+mod)%mod;
else ans=(ans+C(m,c)*C(k-c*n-1+m,m-1)%mod)%mod;
}
printf("%lld\n",ans);
}
}
还是附上超时代码,单次查询是O(lgn)的,如果查询次数比较少可以用这个,可以当作模板。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL mod=998244353;
LL power(LL a){
if(a&1)return -1;
return 1;
}
LL quick_power(LL a,LL b){
LL ans=1%mod;
while(b){
if(b&1){
ans=ans*a%mod;
b--;
}
b>>=1;
a=a*a%mod;
}
return ans;
}
LL C(LL n,LL m){
if(m>n)return 0;
LL ans=1;
for(int i=1;i<=m;i++){
LL a=(n+i-m)%mod;
LL b=i%mod;
ans=ans*(a*quick_power(b,mod-2)%mod)%mod;
}
return ans;
}
LL lucas(LL n,LL m){
if(m==0)return 1;
return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
int main(){
LL n,m,k,ans;
int T;
scanf("%d",&T);
while(T--){
ans=0;
scanf("%lld%lld%lld",&n,&m,&k);
for(LL i=0;i*n<=k;i++){
ans=(ans+(((power(i)*lucas(m,i))%mod)*lucas(m-1+k-n*i,m-1))%mod)%mod;
}
printf("%lld\n",ans);
}
}
HDU 6397(2018多校第8场1001) Character Encoding 容斥的更多相关文章
- hdu 5288||2015多校联合第一场1001题
pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...
- HDU 6395(2018多校第7场1010)Sequence
不久前做过POJ3070,所以知道这题要用矩阵快速幂优化,但是这个题的递推公式中有一项⌊p/n⌋,场上就不会了... 下来才知道要用分块矩阵快速幂,因为⌊p/n⌋最多有2√p块,可以对每一块使用快速幂 ...
- HDU 6396(2018多校第七场1011) Swordsman
场上场下各种TLE到怀疑人生...经过大佬指点之后才知道要用fread才能过,一般的快读不行... 题意:一个剑客打小怪兽,有n头小怪兽,剑客和小怪兽有m个属性.只有剑客的m个属性都大于等于某个小怪兽 ...
- 多校 HDU 6397 Character Encoding (容斥)
题意:在0~n-1个数里选m个数和为k,数字可以重复选: 如果是在m个xi>0的情况下就相当于是将k个球分割成m块,那么很明显就是隔板法插空,不能为0的条件限制下一共k-1个位置可以选择插入隔板 ...
- HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法
地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others) M ...
- hdu 3682 10 杭州 现场 C To Be an Dream Architect 容斥 难度:0
C - To Be an Dream Architect Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
- Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6308 Time Zone Time Limit: 2000/1000 MS (Java/Others) ...
- 2018多校第十场 HDU 6430 (线段树合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6430 题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的 ...
- 2018多校第三场 hdu6331 M :Walking Plan
题目链接 hdu6331 自我吐槽,这场多校大失败,开局签到因输入输出格式写错,wa了3发.队友C题wa了1个小时,还硬说自己写的没错,结果我随便造了个小数据,他都没跑对.然后跑对了后又进入了无限的卡 ...
随机推荐
- 2016/05 - Mars ISC 面试过程全记录
一.Mars phone interview 还记得当时我接到Mars phone interview的时候我还和女友在成都玩,真是[好事多磨 x1],猎头通知可能下午会打电话,早早的吃完午饭我就准备 ...
- QQ帐户的申请与登陆(25 分)
实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤),随后给出N行指令.每行指令的格式为:“命令符(空格)QQ号码( ...
- SQL夯实基础(四):子查询及sql优化案例
首先我们先明确一下sql语句的执行顺序,如下有前至后执行: (1)from (2) on (3) join (4) where (5)group by (6) avg,sum... (7 ...
- [ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件
[ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件 http://laravelacademy.org/post/7812.html 简介 中间件为过滤进入应用的 ...
- 微信小程序 写音乐播放器 slider组件 将value设置为0 真机测试滑块不能回到起点
最近在用微信小程序写一个音频播放页面,做时间进度的时候用到了slider插件,但是在自然播放完成,或者上/下切换的时候,将slider的value属性值设为0,开发工具上滑块会回到起点,有效.但是真机 ...
- 学习动态性能表(18)--v$system_event
学习动态性能表 第18篇--V$SYSTEM_EVENT 2007.6.13 本视图概括了实例各项事件的等待信息.v$session_wait显示了系统的当前等待项,v$system_event则提 ...
- Java 时间工具类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 1.Calendar 转化 String ...
- uboot - *** Warning - bad CRC, using default environment
出现这个现象的原因 环境变量存储区没有相应的数据,产生的原因可能是: 1.首次烧写uboot启动,,出现这个提示,执行saveenv 指令保存环境变量即可: 2.nor fash芯片的 基地址出错. ...
- Day2-VIM(四):修改
字符替换 r 单个字符替换 R 连续替换 - 更改大小写 很简单,多试试就行了 tips:4-更改连续4个字符的大小写,很有意思 单词修改 cw 从光标处修改到单词结尾 cb 从光标处修改到单词开头 ...
- 关于web.xml不同版本之间的区别
一.Servlet 2.3 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...