洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)
考虑容斥。我们记 \(a_i\) 为钦定 \(i\) 个人被 B 神碾压的方案数,如果我们已经求出了 \(a_i\) 那么一遍二项式反演即可求出答案,即 \(ans=\sum\limits_{i=k}^{n-1}a_i(-1)^{i-k}\dbinom{i}{k}\),于是现在问题转化为怎样求 \(a_i\)。首先我们肯定要从另外 \(n-1\) 个学生中选出这 \(i\) 个,方案数 \(\dbinom{n-1}{i}\),其次,根据“碾压”的定义,这 \(i\) 个学生在任何一门学科中的分数都 \(\le\) B 神的分数,也就是说对于任何一门学科 \(j\),都有这 \(i\) 个学生属于被 B 神吊打的 \(n-r_j\) 个学生中,故对于每一门学科,被被 B 神吊打的 \(n-r_j\) 个学生中有 \(i\) 个学生是确定的,我们只需另从 \(n-i-1\) 个学生中选出 \(n-r_j-i\) 即可,方案数为 \(\dbinom{n-i-1}{n-i-r_j}\),再其次,对每门学科我们要确定有多少种可能的分数,我们枚举 B 神的分数 \(l\),那么对于被 B 神吊打的 \(n-r_j\) 个学生,每个人都有 \(l\) 种可能的分数,方案数 \(l^{n-r_j}\),对于吊打 B 神的 \(r_j-1\) 个学生,每个人都有 \(u_j-l\) 种可能的分数,方案数 \((u_j-l)^{r_j-1}\),因此我们有:
\]
由于这题 \(u_i\) 很大,直接算显然无法通过,不过注意到后面那坨东西 \(\sum\limits_{l=1}^{u_j}l^{n-r_j}(u_j-l)^{r_j-1}\) 是与 \(i\) 严格无关的,因此考虑将这东西预处理出来。怎么预处理呢,考虑将这东西用二项式定理展开变个形,具体来说:
&\sum\limits_{l=1}^{u_j}l^{n-r_j}(u_j-l)^{r_j-1}\\
=&\sum\limits_{l=1}^{u_j}l^{n-r_j}\sum\limits_{t=0}^{r_j-1}u_j^t(-l)^{r_j-1-t}\dbinom{r_i-1}{t}\\
=&\sum\limits_{t=0}^{r_j-1}u_j^t\dbinom{r_i-1}{t}\sum\limits_{l=1}^{u_j}l^{n-r_j}(-l)^{r_j-1-t}\\
=&\sum\limits_{t=0}^{r_j-1}u_j^t\dbinom{r_i-1}{t}(-1)^{r_i-1-t}\sum\limits_{l=1}^{u_j}l^{n-1-t}
\end{aligned}
\]
芜湖~好了,前面枚举复杂度显然不会爆,后面那东西是自然数 \(k\) 次幂之和的形式,可以拉格朗日插值求出,于是复杂度就降到了 \(n^2m\),可以通过此题。
const int MAXN=100;
const int MOD=1e9+7;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int n,m,k,u[MAXN+5],r[MAXN+5],s[MAXN+5],f[MAXN+5],fac[MAXN+5],ifac[MAXN+5];
void init_fac(int mx){
for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=mx;i++) ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=mx;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
}
int binom(int n,int k){
if(n<0||k<0||n<k) return 0;
return 1ll*fac[n]*ifac[k]%MOD*ifac[n-k]%MOD;
}
int sum[MAXN+5],pre[MAXN+5],suf[MAXN+5];
int calc(int n,int k){
for(int i=1;i<=k+1;i++) sum[i]=(sum[i-1]+qpow(i,k))%MOD;
pre[0]=n;for(int i=1;i<=k+1;i++) pre[i]=1ll*pre[i-1]*(n-i+MOD)%MOD;
suf[k+2]=1;for(int i=k+1;~i;i--) suf[i]=1ll*suf[i+1]*(n-i+MOD)%MOD;
int ans=0;
for(int i=1;i<=k+1;i++){
int mul=1ll*sum[i]*pre[i-1]%MOD*suf[i+1]%MOD*ifac[i]%MOD*ifac[k+1-i]%MOD;
if((k+1-i)&1) ans=(ans-mul+MOD)%MOD;else ans=(ans+mul)%MOD;
} return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&k);init_fac(n+1);
for(int i=1;i<=m;i++) scanf("%d",&u[i]);
for(int i=1;i<=m;i++) scanf("%d",&r[i]);
for(int i=1;i<=m;i++) for(int l=0;l<r[i];l++){
int mul=1ll*binom(r[i]-1,l)*qpow(u[i],l)%MOD*calc(u[i],n-1-l)%MOD;
if((r[i]-1-l)&1) s[i]=(s[i]-mul+MOD)%MOD;else s[i]=(s[i]+mul)%MOD;
} int ans=0;
for(int i=k;i<n;i++){
int mul=binom(n-1,i);
for(int j=1;j<=m;j++) mul=1ll*mul*binom(n-i-1,n-r[j]-i)%MOD*s[j]%MOD;
if((i-k)&1) ans=(ans-1ll*mul*binom(i,k)%MOD+MOD)%MOD;
else ans=(ans+1ll*mul*binom(i,k)%MOD)%MOD;
} printf("%d\n",ans);
return 0;
}
洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)的更多相关文章
- 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)
洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...
- 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)
bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...
- P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值
LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...
- 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)
洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...
- 洛谷 P1763 状态压缩dp+容斥原理
(题目来自洛谷oj) 一天,maze决定对自己的一块n*m的土地进行修建.他希望这块土地共n*m个格子的高度分别是1,2,3,...,n*m-1,n*m.maze又希望能将这一些格子中的某一些拿来建蓄 ...
- 洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)
洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 ...
- 洛谷 P6276 - [USACO20OPEN]Exercise P(组合数学+DP)
洛谷题面传送门 废了,又不会做/ll orz czx 写的什么神仙题解,根本看不懂(%%%%%%%%% 首先显然一个排列的贡献为其所有置换环的乘积.考虑如何算之. 碰到很多数的 LCM 之积只有两种可 ...
- 洛谷 P4708 - 画画(Burnside 引理+组合数学)
洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...
- bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法
4559: [JLoi2016]成绩比较 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 261 Solved: 165[Submit][Status ...
随机推荐
- 实用小工具:screen
实用小工具:screen 首先,吹爆screen screen,实现了不间断的会话服务,通过SSH连接至远程服务器,当使用了screen开启的会话,不会因为你断开SSH而中断在远程服务器上运行的命令. ...
- Linux过来人帮你理清学习思路
很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...
- 零基础入门必备的Linux命令和C语言基础
文件和目录(底部有视频资料) cd /home 进入 '/ home' 目录' cd - 返回上一级目录 cd -/- 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 c ...
- Vue:Vue的介绍以及组件剖析
介绍 现在,随着基于JavaScript的单页应用程序(SPA)和服务器端渲染(SSR)的兴起,可以用JavaScript编写整个前端应用程序,并整洁地管理和维护该应用程序的前端代码.诸如Angula ...
- vim 让人爱不释手的编辑器之神
VIM 基本介绍 vim诞生已有20多年,它常被人称之为编辑器之神,vim的操作理念可以说是独具一格而又出类拔萃,使用vim能极大的提升文本处理效率,因此熟练掌握vim应该是每个程序员都应该做到的事情 ...
- Tarjan算法离线 求 LCA(最近公共祖先)
本文是网络资料整理或部分转载或部分原创,参考文章如下: https://www.cnblogs.com/JVxie/p/4854719.html http://blog.csdn.net/ywcpig ...
- 面试题系列:工作5年,第一次这么清醒的理解final关键字?
面试题:用过final关键字吗?它有什么作用 面试考察点 考察目的: 了解面试者对Java基础知识的理解 考察人群: 工作1-5年,工作年限越高,对于基础知识理解的深度就越高. 背景知识 final关 ...
- 『学了就忘』Linux基础命令 — 30、find命令详细说明
目录 1.find命令的基本信息 2.find命令基本使用 3.按照文件大小搜索 4.按照修改时间搜索 5.按照权限搜索 6.按照所有者和所属组搜索 7.按照文件类型搜索 8.逻辑运算符 (1)-a: ...
- ansible基本命令及剧本
ansible常用命令 1. -v, –verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv) 2. -i, –inventory=PATH 指定host文件的路径 ...
- D3.js V5 教程
D3.js V5 教程 1.在项目中使用D3.js 2. 选择元素和设置(获取)属性 3. 绑定数据 4. 理解Update.Enter.Exit 与 添加.删除元素 未完待续..........