洛谷 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 ...
随机推荐
- 学习笔记-React的简单介绍&工作原理
一.React简单介绍 1.React起源于Facebook内部项目,与2013年5月 2.是一个用于构建用户界面的JavaScript库 二.React特点 1.声明式设计-React采用声明范式, ...
- Less-(38~41) 堆叠注入
首先申明,Less-(38~41)可以采取和Less-(1~4)相同的解法:(一一对应) 然而,他们的漏洞其实更大,我们可以做更多具有破坏性的事情. 代码审计: Less-(38~41): 41的$s ...
- 【Java虚拟机3】类加载器
前言 Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类. ...
- Vite启动后提示Network: use `--host` to expose
当使用 Vite 构建项目后,发现只有localhost + 端口 服务,没有 IP + 端口服务. 运行npm run dev,终端提示Vite启动后提示Network: use '--host' ...
- Manjaro安装Mariadb
Mariadb是MySQL的一个复刻.由于MySQL被Oracle公司收购,MySQL的一些原始开发者担心MySQL会有开源方面的某些隐患,故领导开发了Mariadb. 如今,Mariadb已经作为许 ...
- NOIP模拟22
T1d 一道垃圾贪心,写个堆优化或者桶就行 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; ...
- Vagrant 搭建开发环境实践
介绍 Development Environments Made Easy -官网标题 vagrant是一个命令行的虚拟机管理程序.用于简化搭建开发环境. vagrant使用ruby语言基于Chef ...
- poj 3417 Network (LCA,路径上有值)
题意: N个点,构成一棵树.给出这棵树的结构. M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边.这样就形成了有很多环的一个新"树". 现在要求你在原树中断一条 ...
- NOIP模拟92(多校25)
前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...
- GitHub 开源的小工具「GitHub 热点速览 v.21.45」
作者:HelloGitHub-小鱼干 Copilot 是 GitHub 官方出品的代码自动补全工具,之前使用该工具需要有一定的要求.而本周靠 2k+ star 上热点的 copilot-docs 则是 ...