LOJ #2026「JLOI / SHOI2016」成绩比较
很好的锻炼推柿子能力的题目
题意
有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数
定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数
已知第一个人第$ i$们学科的排名为$ R_i$,
即这门学科不低于$ n-R_i$人的分数,但一定低于$ R_i-1$人的分数
求有多少种方案使得第一个人恰好「打爆」了$ k$个人
两种方案不同当且仅当存在两个人的分数不同
$ n,m \leq 100 ,U_i \leq 10^9$
$ Solution$
首先容斥
设$ g_x$表示第一个人至少「打爆」了$ x$个人的方案数,
$ A_i$表示给所有人第$ i$门学科分配分数使得第一个人排名正确的方案数
有
$ g_x=\binom{n-1}{x} \prod\limits_{i=1}^m \binom{n-x-1}{n-x-R_i}A_i$
$A_i=\sum\limits_{j=1}^{U_i}j^{n-R_i}(U_i-j)^{R_i-1}$
$ g_x$的意义是
先选出被吊打的$ x$个人
再枚举每一门学科,这门学科比$ n-R_i$人高,
除去被吊打的$ x$人外还需要在未被吊打的$ n-x-1$人中选出$ n-R_i-x$人这门比第一个人低
然后再给这$ n$个人分配分数
$ A_i$的意义是:
枚举第一个人第$ i$门的分数$ j$,有$ n-R_i$人分数不能高于$j$,其余$ R_i-1$人分数必须高于$ j$
容易发现瓶颈在快速计算$ A_i$上
我们将$ A_i$二项式展开得
$A_i=\sum\limits_{j=1}^{U_i}j^{n-R_i}(U_i-j)^{R_i-1}$
$A_i=\sum\limits_{j=1}^{U_i}j^{n-R_i}\sum\limits_{k=0}^{R_i-1} \binom{R_i-1}{k}{(U_i)}^k(-j)^{R_i-k-1}$
$A_i=\sum\limits_{k=0}^{R_i-1} \binom{R_i-1}{k}{(U_i)}^k\sum\limits_{j=1}^{U_i}j^{n-R_i}(-j)^{R_i-k-1}$
$A_i=\sum\limits_{k=0}^{R_i-1} \binom{R_i-1}{k}{(U_i)}^k(-1)^{R_i-k-1}\sum\limits_{j=1}^{U_i}j^{n-k-1}$
前半部分非常好算
后半部分是一个自然数幂和,可以拉格朗日插值解决
拉格朗日插值过程中可以通过预处理前后缀的方式去掉不必要的求逆元复杂度使除预处理外单次$ O(n)$
这样就可以快速算出$ g_x$了
然后就是喜闻乐见的反演环节
设$ f_x$表示第一个人恰好「打爆」了$ x$个人
有
$ g_x=\sum\limits_{i=x}^n \binom{i}{x}f_i$
$ f_x=\sum\limits_{i=x}^n(-1)^{i-x} \binom{i}{x}g_i$
然后这道题就解决了
总复杂度:$ O(n^2m)$
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define p 1000000007
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt;
int C[][],f[],B[],U[],R[];
int ksm(int x,int y){
int ans=;
for(rt i=y;i;i>>=,x=1ll*x*x%p)if(i&)ans=1ll*ans*x%p;
return ans;
}
int mi[][];//前i个数的j次幂
int jc[],njc[],inv[];
int qz[],hz[];
int cz(int n,int k){
if(!k)return n;int ans=;
if(n<=)return mi[n][k];
int up=;qz[]=hz[k+]=;
for(rt i=;i<=k+;i++)qz[i]=1ll*qz[i-]*(n-i)%p;
for(rt i=k+;i>=;i--)hz[i]=1ll*hz[i+]*(n-i)%p;
for(rt i=;i<=k+;i++){
int down=1ll*njc[i-]*njc[k+-i]%p;
if(i+k&)down=-down;
(ans+=1ll*mi[i][k]*qz[i-]%p*hz[i+]%p*down%p%p)%=p;
}
return ans;
}
int main(){
jc[]=jc[]=njc[]=njc[]=inv[]=inv[]=;
for(rt i=;i<=;i++){
jc[i]=1ll*jc[i-]*i%p;
inv[i]=1ll*inv[p%i]*(p-p/i)%p;
njc[i]=1ll*njc[i-]*inv[i]%p;
}
for(rt i=;i<=;i++)
for(rt j=;j<=;j++)if(j==)mi[i][j]=i;else mi[i][j]=1ll*mi[i][j-]*i%p;
for(rt j=;j<=;j++)
for(rt i=;i<=;i++)mi[i][j]=(mi[i-][j]+mi[i][j])%p;
n=read();m=read();int K=read();
for(rt i=;i<=m;i++)U[i]=read();
for(rt i=;i<=m;i++)R[i]=read();
for(rt i=;i<=;i++){
C[i][]=;
for(rt j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%p;
}
for(rt i=;i<=m;i++){
for(rt k=;k<=R[i]-;k++){
int ret=;
(ret+=1ll*C[R[i]-][k]*ksm(U[i],k)%p*cz(U[i],n-k-)%p)%=p;
if(R[i]-k-&)(B[i]-=ret)%=p;else (B[i]+=ret)%=p;
}
}
for(rt i=;i<n;i++){
f[i]=;
for(rt j=;j<=m;j++){
if(n-i-R[j]<){
f[i]=;
break;
}
(f[i]=1ll*f[i]*C[n-i-][n-i-R[j]]%p*B[j]%p)%=p;
}
f[i]=1ll*f[i]*C[n-][i]%p;
}
int ans=;
for(rt j=K,tag=;j<n;j++,tag*=-)(ans+=1ll*f[j]*C[j][K]*tag%p)%=p;
cout<<(ans+p)%p;
return ;
}
LOJ #2026「JLOI / SHOI2016」成绩比较的更多相关文章
- loj #2026. 「JLOI / SHOI2016」成绩比较
#2026. 「JLOI / SHOI2016」成绩比较 题目描述 THU 的 G 系中有许许多多的大牛,比如小 R 的室友 B 神.B 神已经厌倦了与其他的同学比较 GPA(Grade Poin ...
- 【LOJ】#2026. 「JLOI / SHOI2016」成绩比较
题解 用\(f[i][j]\)表示考虑了前i个排名有j个人被碾压 \(f[i][j] = f[i - 1][k] \* C[k][j] \* C[N - k - 1][N - r[i] - j] \* ...
- loj #2024. 「JLOI / SHOI2016」侦查守卫
#2024. 「JLOI / SHOI2016」侦查守卫 题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...
- loj #2025. 「JLOI / SHOI2016」方
#2025. 「JLOI / SHOI2016」方 题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形.上帝把我们派到了一个有 NNN ...
- loj2026 「JLOI / SHOI2016」成绩比较
orz #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...
- 【LOJ】 #2025. 「JLOI / SHOI2016」方
题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...
- 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫
题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...
- loj2024「JLOI / SHOI2016」侦查守卫
too hard #include <iostream> #include <cstdio> using namespace std; int n, d, m, uu, vv, ...
- Loj #2495. 「AHOI / HNOI2018」转盘
Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...
随机推荐
- (六)Oracle 的 oracle表查询关键字
参考:http://www.hechaku.com/Oracle/oracle_tables2.html 1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们 ...
- java List<String> 转换成带逗号的字符串
使用commons-lang3-3.3.2.jar org.apache.commons.lang3.StringUtils.join(applyNameList, ",");
- PHP工厂方法模式
此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成.这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建.当 ...
- 配置ssl
1.配置 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000&q ...
- (线性DP LIS)POJ2533 Longest Ordered Subsequence
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 66763 Acc ...
- Harbor 使用 Helm 一键安装
安装 Harbor Harbor 支持多种安装方式,源码目录下面默认有一个安装脚本(make/install.sh),采用 docker-compose 的形式运行 Harbor 各个组件,和前面的课 ...
- thinkphp 攻略
php框架 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难, ...
- bzoj2049 线段树 + 可撤销并查集
https://www.lydsy.com/JudgeOnline/problem.php?id=2049 线段树真神奇 题意:给出一波操作,拆边加边以及询问两点是否联通. 听说常规方法是在线LCT, ...
- jmeter每10个停一会实现方案
foreach控制器中加个if控制器,if控制器条件${__groovy("${__counter(TRUE,)}".toInteger() % 10 == 0,)},再往if控制 ...
- Struts2_API
1.访问servletAPI方法1 public String execute() throws Exception { //request域对象==>map (struts2并不推荐使用原生r ...