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 ...
随机推荐
- flask Blueprint蓝图
首先要了解蓝图的作用,模拟场景在团队开发过程中团队每个人都在写自己负责的功能模块,那多个py文件模板,我们如果完成后需要运行是不是要运行多个服务?但是我们的项目是一个整体,而不是零散的,所以我们怎么把 ...
- eclipse安装activiti 工作流插件
记录一下下eclipse集成activiti插件的过程. eclipse的版本信息为:Version: Mars.1 Release 1 (4.5.1) 下面就开始介绍下如何安装activiti插件. ...
- testng优化:失败重跑,extentReport+appium用例失败截图,测试报告发邮件
生成的单html方便jenkins集成发邮件,= = 构建失败发邮件 参考:https://blog.csdn.net/galen2016/article/details/77975965 步骤: 1 ...
- Python3的第一个程序
软件:Anaconda Navigator集成开发环境中的Spyder,自带Python,无需单独安装. 注意:Python对缩进和空格敏感,代码必须对齐(包括注释),否则出现错误unexpected ...
- 微信小程序:图片预览
wxml页面: <image src='{{UPLOAD_IMAGES_URL}}{{vv.img_s}}' data-src="{{vv.img}}" bindtap=&q ...
- puppeteer端对端测试demo
1. 下载pupperteer npm i puppeteer 2. 启动一个本地服务 localhost 3. 开启测试 const puppeteer = require('puppeteer') ...
- Servlet_问题总结
1.Servlet转发到JSP后页面的CSS样式丢失,页面布局混乱,原来能点的链接现在失效 原因:原来前台页面(JSP|HTML)在引用静态资源(CSS|JS|JSP页面)时使用的是相对路径, 导致由 ...
- MyBatis-Helloworld
一.依赖配置 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- pom大全
springboot集合 父模块 <parent> <groupId>org.springframework.boot</groupId> <artifact ...
- ffmpeg的各种黑科技
获取音频的时长 /** * 获取视频文件的时长 * @param ffmpegPath 是ffmpeg软件存放的目录,sourceFile是目标文件 * @return */ public Strin ...