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个小时,还硬说自己写的没错,结果我随便造了个小数据,他都没跑对.然后跑对了后又进入了无限的卡 ...
随机推荐
- java多线程学习一
声明:本篇博客是本人为了自己学习保存的心得,其内容主要是从大神——五月的仓颉的博客中学习而来,在此多谢大神五月的仓颉的分享,敬礼! 第一章:进程和线程的概念 进程:进程是操作系统中作为分配资源的基本单 ...
- The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsoft SQL Server,错误: 15128)
记录下 The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Micr ...
- jquery获取上传进度和取消上传操作
var xhrOnProgress=function(fun) { xhrOnProgress.onprogress = fun; //绑定监听 //使用闭包实现监听绑 return function ...
- QQ发送位置(高德地图)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- OpenCV 2.4.9 +VS2013 开发环境配置
OpenCV 的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac O ...
- UVA - 10934 Dropping water balloons (dp,逆向思维)
题目链接 题目大意:给你n个规格一样的气球和一栋大楼的高度,求最少试验几次能测出气球最高在哪一层掉下来不破. 如果这道题想用(dp[i][j]=用i个气球测出j高度的楼需要几次)来作为状态的话,那你就 ...
- Java模版引擎:jsp、freemarker、velocity区别
在java领域,表现层技术主要有三种:jsp.freemarker.velocity. jsp是大家最熟悉的技术优点:1.功能强大,可以写java代码2.支持jsp标签(jsp tag)3.支持表达式 ...
- BerOS file system
The new operating system BerOS has a nice feature. It is possible to use any number of characters '/ ...
- source In sight 中修改自动补全快捷键方式
点击 “options”中的“key Assi...”,找到如下 点击“Assign New Key...”之后按键盘上的指定按键就能重新设定.
- vue.js初学(一) vue的入门编程
1:首先引入vue.js 2:点击事件 <div id='clickVue'> <p>{{message}}</p> <button v-on:click=& ...