Description

题库链接( \(\text{bzoj}\) 不知道为什么过不了啊... \(\text{luogu loj}\) 都能过...就给 \(\text{luogu}\) 的链接了...)

共有 \(n\) 位同学, \(M\) 门必修课。一位同学在必修课上可以获得的分数是 \(1\) 到 \(U_i\) 中的一个整数。

如果在每门课上 \(A\) 获得的成绩均小于等于 \(B\) 获得的成绩,则称 \(A\) 被 \(B\) 碾压。在 \(B\) 神的说法中,共有 \(K\) 位同学被他碾压(不包括他自己)。

\(B\) 神在第 \(i\) 门必修课中排名为 \(R_i\) 。这里的排名是指:如果 \(B\) 神某门课的排名为 \(R\) ,则表示有且仅有 \(R-1\) 位同学这门课的分数大于 \(B\) 神的分数,有且仅有 \(N-R\) 位同学这门课的分数小于等于 \(B\) 神(不包括他自己)。

我们需要求出全系所有同学每门必修课得分的情况数,使其既能满足B神的说法,也能符合排名。这里两种情况不同当且仅当有任意一位同学在任意一门课上获得的分数不同。

计算出情况数模 \(10^9+7\) 的。

\(N\leq 100,M\leq 100,Ui\leq 10^9\)

Solution

由于只有 \(k\) 名同学被碾压,故要保证其余的 \(n-1-k\) 名同学至少有一门分数要高于他。

我们有 \(n-1\choose k\) 种方案选出被碾压的 \(k\) 个人,对于剩下的 \(n-1-k\) 个人,我们记 \(f_x\) 为至多有 \(x\) 个人满足至少一门分数高于他,那么 \(f_x=\prod\limits_{i=1}^m{x\choose R_i-1}\) 。再设 \(g_x\) 为恰有 \(x\) 个人满足至少一门分数高于他,显然我们要求的是 \(g_{n-k-1}\) 。

容易得到

\[f_x=\sum_{i=1}^x {x\choose i}g_i\]

由二项式反演,得到

\[g_x=\sum_{i=1}^x (-1)^{x-i}{x\choose i}f_i\]

那么

\[g_{n-k-1}=\sum_{i=1}^{n-k-1}(-1)^{n-k-1-i}{n-k-1\choose i}\prod_{j=1}^m{i\choose R_j-1}\]

不过这只考虑了合法的安排相对分数高低情况,还没有考虑具体分数的关系。

不妨记 \(S\) 为一种人员安排情况下不同的分数安排方法。

我们枚举他的分数得到

\[\begin{aligned}S&=\prod_{i=1}^m\sum_{j=1}^{U_i}j^{n-R_i}(U_i-j)^{R_i-1}\\&=\prod_{i=1}^m\sum_{j=1}^{U_i}j^{n-R_i}\sum_{k=0}^{R_i-1}(-1)^k{R_i-1\choose k}j^kU_i^{R_i-1-k}\\&=\prod_{i=1}^m\sum_{j=1}^{U_i}\sum_{k=0}^{R_i-1}j^{n-R_i+k}(-1)^k{R_i-1\choose k}U_i^{R_i-1-k}\\&=\prod_{i=1}^m\sum_{k=0}^{R_i-1}(-1)^k{R_i-1\choose k}U_i^{R_i-1-k}\sum_{j=1}^{U_i}j^{n-R_i+k}\end{aligned}\]

注意到 \(Q=\sum\limits_{j=1}^{U_i}j^{n-R_i+k}\) 中的 \(U_i\) 会很大,显然不能直接枚举,我们可以插值解决。预处理出 \(S\) 的复杂度是 \(O(mn^2)\) 的。

最终答案就是

\[{n-1\choose k}g_{n-k-1}S\]

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 233+5, yzh = 1e9+7; int n, m, k, U[N], R[N];
int fac[N], ifac[N];
int prime[N], tot, isprime[N], f[N], s1[N], s2[N]; int quick_pow(int a, int b) {
int ans = 1;
while (b) {
if (b&1) ans = 1ll*ans*a%yzh;
b >>= 1, a = 1ll*a*a%yzh;
}
return ans;
}
int C(int n, int m) {return 1ll*fac[n]*ifac[m]%yzh*ifac[n-m]%yzh; }
int lagrange(int *y, int k, int xi) {
int ans = 0; ++k;
s1[0] = xi, s2[k+1] = 1;
for (int i = 1; i <= k; i++) s1[i] = 1ll*s1[i-1]*(xi-i)%yzh;
for (int i = k; i >= 0; i--) s2[i] = 1ll*s2[i+1]*(xi-i)%yzh;
for (int i = 0; i <= k; i++)
(ans += 1ll*y[i]*(i == 0 ? 1 : s1[i-1])%yzh*s2[i+1]%yzh*ifac[i]%yzh*((k-i)&1 ? -1 : 1)*ifac[k-i]%yzh) %= yzh;
return ans;
}
int getQ(int xi, int k) {
tot = 0; memset(isprime, 1, sizeof(isprime));
isprime[1] = 0; f[0] = 0, f[1] = 1;
for (int i = 2; i <= k+1; i++) {
if (isprime[i]) prime[++tot] = i, f[i] = quick_pow(i, k);
for (int j = 1; j <= tot && i*prime[j] <= k+1; j++) {
isprime[i*prime[j]] = 0, f[i*prime[j]] = 1ll*f[i]*f[prime[j]]%yzh;
if (i%prime[j] == 0) break;
}
}
for (int i = 1; i <= k+1; i++) (f[i] += f[i-1]) %= yzh;
if (xi <= k+1) return f[xi];
return lagrange(f, k, xi);
}
int getS() {
int ans = 1;
for (int i = 1; i <= m; i++) {
int sum = 0;
for (int k = 0; k <= R[i]-1; k++)
if (k&1) (sum -= 1ll*C(R[i]-1, k)*quick_pow(U[i], R[i]-1-k)%yzh*getQ(U[i], n-R[i]+k)%yzh) %= yzh;
else (sum += 1ll*C(R[i]-1, k)*quick_pow(U[i], R[i]-1-k)%yzh*getQ(U[i], n-R[i]+k)%yzh) %= yzh;
ans = 1ll*ans*sum%yzh;
}
return ans;
}
void work() {
scanf("%d%d%d", &n, &m, &k);
fac[0] = fac[1] = ifac[0] = ifac[1] = 1;
for (int i = 2; i < N; i++) ifac[i] = -1ll*yzh/i*ifac[yzh%i]%yzh;
for (int i = 2; i < N; i++)
ifac[i] = 1ll*ifac[i-1]*ifac[i]%yzh,
fac[i] = 1ll*fac[i-1]*i%yzh;
for (int i = 1; i <= m; i++) scanf("%d", &U[i]);
for (int i = 1; i <= m; i++) scanf("%d", &R[i]);
int S = getS(), ans = 0;
for (int i = 1; i <= n-k-1; i++) {
int sum = 1;
for (int j = 1; j <= m; j++) sum = 1ll*sum*C(i, R[j]-1)%yzh;
if ((n-k-1-i)&1) (ans -= 1ll*sum*C(n-k-1, i)%yzh) %= yzh;
else (ans += 1ll*sum*C(n-k-1, i)%yzh) %= yzh;
}
ans = 1ll*ans*S%yzh*C(n-1, k)%yzh;
printf("%d\n", (ans+yzh)%yzh);
}
int main() {work(); return 0; }

[JLOI 2016]成绩比较的更多相关文章

  1. 动态规划(计数DP):JLOI 2016 成绩比较

    Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个 ...

  2. LOJ2026 JLOI/SHOI2016 成绩比较 组合、容斥

    传送门 感觉自己越来越愚钝了qwq 先考虑从\(n-1\)个人里安排恰好\(k\)个人被碾压,然后再考虑如何分配分数,两者乘起来得到答案. 对于第一部分,可以考虑容斥:设\(f_i\)表示\(i\)个 ...

  3. 【BZOJ 4561】【JLOI 2016】圆的异或并

    http://www.lydsy.com/JudgeOnline/problem.php?id=4561 一开始并不会做,后来看题解看懂了. 看懂了之后还是错了好几次,数组大小手残开小了. 圆的包含并 ...

  4. 计数方法(扫描线):JLOI 2016 圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  5. 解题:JLOI 2016 侦查守卫

    题面 经典的$cov-unc$树形dp(这词是你自己造的吧=.=) 设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少 ...

  6. BZOJ 4557 (JLOI 2016) 侦查守卫

    4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 493 Solved: 342 [Submit][Status ...

  7. [总结]其他杂项数学相关(定理&证明&板子)

    目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...

  8. loj #2026. 「JLOI / SHOI2016」成绩比较

    #2026. 「JLOI / SHOI2016」成绩比较   题目描述 THU 的 G 系中有许许多多的大牛,比如小 R 的室友 B 神.B 神已经厌倦了与其他的同学比较 GPA(Grade Poin ...

  9. 2016福州大学软件工程Beta阶段团队作业成绩汇总

    1.评分规则 本次Beta阶段团队作业评分方法如下: 团队得分=[[7次scrum过程评分+(小组互评得分+教师评分)/2]/2],其中过程.小组.教师各30分 说明:由于没有规定提交团队贡献比,因此 ...

随机推荐

  1. linux 查看信息-磁盘分区&网络

    磁盘和分区 1.查看挂接的分区状态 2.查看所有交换分区 3.查看启动时IDE设备检测状况 网络 1.查看网络接口属性 2.查看防火墙设置 3.查看路由表 4.查看所有监听端口 5.查看所有已经建立的 ...

  2. js将数组根据条件分组

    //将数组根据条件分组 function getTreeDateByParam(list, param, fun){ var data = {}; if(list && list.le ...

  3. Oracle 异常 中文乱码

    环境变量 NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  4. Beta冲刺 (1/7)

    Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 熟悉并编写小程序的自定义控件 展示G ...

  5. WPF 通过线程使用ProcessBar

    WPF下使用进度条也是非常方便的,如果直接采用循环然后给ProcessBar赋值,理论上是没有问题的,不过这样会卡主主UI线程,我们看到的效果等全部都结束循环后才出现最后的值. 所以需要采用线程或者后 ...

  6. 背水一战 Windows 10 (77) - 控件(控件基类): ContentControl, UserControl, Page

    [源码下载] 背水一战 Windows 10 (77) - 控件(控件基类): ContentControl, UserControl, Page 作者:webabcd 介绍背水一战 Windows ...

  7. linux配置防火墙和重启防火墙

    1.在linux系统里面找到并打开编辑配置防火墙的文件,执行命令: vi /etc/sysconfig/iptables. 2.在上面打开的文件里面加入一下语句: -A INPUT -m state ...

  8. Navicat Premium Mac V12.0.22.0 中英文破解 亲测可用

    换了Mac电脑后网上找了好些个 Navicat Premium 破解版本, 特别是CSDN上要积分下载的也不能用,浪费积分下,都是些坑爹破解方法,浪费了好些时间,今天介绍看到的一套有效的破解过程 1. ...

  9. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

  10. IDEA的maven配置

    刚接触maven的时候,也知道maven目录下有个setting文件可以设置远程maven库的地址,但自己实践的时候,发现setting文件的地址都被注释掉了,但是jar包还是能成功下载下来,那这个下 ...