题面传送门

考虑容斥。我们记 \(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}\),因此我们有:

\[a_i=\dbinom{n-1}{i}\prod\limits_{j=1}^m\dbinom{n-i-1}{n-i-r_j}\sum\limits_{l=1}^{u_j}l^{n-r_j}(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\) 严格无关的,因此考虑将这东西预处理出来。怎么预处理呢,考虑将这东西用二项式定理展开变个形,具体来说:

\[\begin{aligned}
&\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]成绩比较(容斥原理+组合数学+拉格朗日插值)的更多相关文章

  1. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

  2. 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)

    bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...

  3. P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值

    LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...

  4. 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)

    洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...

  5. 洛谷 P1763 状态压缩dp+容斥原理

    (题目来自洛谷oj) 一天,maze决定对自己的一块n*m的土地进行修建.他希望这块土地共n*m个格子的高度分别是1,2,3,...,n*m-1,n*m.maze又希望能将这一些格子中的某一些拿来建蓄 ...

  6. 洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)

    洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 ...

  7. 洛谷 P6276 - [USACO20OPEN]Exercise P(组合数学+DP)

    洛谷题面传送门 废了,又不会做/ll orz czx 写的什么神仙题解,根本看不懂(%%%%%%%%% 首先显然一个排列的贡献为其所有置换环的乘积.考虑如何算之. 碰到很多数的 LCM 之积只有两种可 ...

  8. 洛谷 P4708 - 画画(Burnside 引理+组合数学)

    洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...

  9. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

随机推荐

  1. LeetCode:回溯算法

    回溯算法 这部分主要是学习了 labuladong 公众号中对于回溯算法的讲解 刷了些 leetcode 题,在此做一些记录,不然没几天就忘光光了 总结 概述 回溯是 DFS 中的一种技巧.回溯法采用 ...

  2. MarkDown之Typora使用

    Typora:所见即所得 常用快捷键 加粗:ctrl + B 标题:ctrl + 16,对于与16级标题 插入公式:ctrl + Shift + m 插入代码:ctrl + Shift + K 插入图 ...

  3. BUAA SE | 提问回顾与个人总结

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 深入理解软件工程 这个作业在哪个具体方面帮助我实现目标 ...

  4. 使用logstash的grok插件解析springboot日志

    使用logstash的grok插件解析springboot日志 一.背景 二.解决思路 三.前置知识 四.实现步骤 1.准备测试数据 2.编写`grok`表达式 3.编写 logstash pipel ...

  5. Noip模拟33垫底反思 2021.8.8

    T1 Hunter 考场上没写$%p$挂了25分.也是很牛皮,以后打完过了样例一定要检查 因为样例太小了......很容易忘记%%%% 正解随便手模就出来了. 1 #include<bits/s ...

  6. 单片机I/O口推挽与开漏输出详解(力荐)

    推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...

  7. openstack 虚机热迁移问题:虚机状态一直处于迁移中的情况处理

    前提:在偶尔的虚机热迁移中,发现虚机一直属于迁移状态中. 但是查看后台流量监控,发现没有流量已经下来了.然后在目标机器上查看,发现kvm已经在目标机器上. 1.查看kvm 实际所处宿主机方法: a.拿 ...

  8. 好好的 Tair 排行榜不用,非得自己写?20 行代码实现高性能排行榜

    TairZset 是阿里云自研的可实现任意维度 double 类型的分值排序的数据结构,借助 Tair 客户端同时可实现扩展性,即可以将计算任务分布至多个数据节点完成,实现分布式排行榜能力.本文介绍了 ...

  9. robot_framewok自动化测试--(3)测试项目与测试套件的概念

    测试项目与测试套件的概念 如果你查看当前所创建的项目会发现,"test_project"是一个目录: "test_suit"则是一个 txt 文件: " ...

  10. 子查询 & 联合查询

    子查询 嵌套在其他语句内部的select语句称为子查询或内查询,外层的语句可以是insert.update.delete.select等,一般select作为外层语句较多.外面如果为select语句, ...