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. c++ 计算cpu占用率

    计算CPU占用率就是获取系统总的内核时间 用户时间及空闲时间 其中空闲时间就是内核空转 所以内核时间包含空闲时间 然后计算 运行时间 = 内核时间 加 用户时间 减去 空闲时间 间隔时间 =  内核时 ...

  2. 学习pyyaml

    网上查了一圈,觉得较好的yaml教程有: YAML 语言教程 :http://www.ruanyifeng.com/blog/2016/07/yaml.html. 另外,在github的pyyaml库 ...

  3. 初级PM要做什么

    首先让我们看下这张图,产品经理进入公司后将要面临着许多工作 或许你有疑问,如果是产品助理的话,上面这么多工作都要去做吗? 其实不然,初级产品经理由于工作经历有限,对行业的研究以及对市场的把控是有视野限 ...

  4. More x64 assembler fun-facts–new assembler directives(转载)

    原文地址 The Windows x64 ABI (Application Binary Interface) presents some new challenges for assembly pr ...

  5. python基本数据类型之字符串(三)

    python基本数据类型之字符串(三) 转换和判断方法 在python中,有一些内置方法可以将字符串转化特定形式,而与之对应的一些方法可以判断字符串是否符合某些形式.因此,在这篇文章中,笔者把转换方法 ...

  6. 整理python小爬虫

    编码使我快乐!!! 我也不知道为什么,遇到自己喜欢的事情,就越想做下去,可以一个月不出门,但是不能一天没有电脑 掌握程度:对python有了一个更清晰的认识,自动化运维,也许可以用python实现呢, ...

  7. oracle utl_http 访问https类型

    https://oracle-base.com/articles/misc/utl_http-and-ssl http://blog.whitehorses.nl/2010/05/27/access- ...

  8. Android 框架式编程 —— 起篇

    一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...

  9. 第31节:Java基础-类与对象

    前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...

  10. Archive required for library “xxx” cannot be read or is not a valid zip file报错解决

    在项目中导入别人的maven项目时报错:Archive required for library “xxx” cannot be read or is not a valid zip file 网上查 ...