很好的锻炼推柿子能力的题目

LOJ #2026


题意

有$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」成绩比较的更多相关文章

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

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

  2. 【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] \* ...

  3. loj #2024. 「JLOI / SHOI2016」侦查守卫

    #2024. 「JLOI / SHOI2016」侦查守卫   题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...

  4. loj #2025. 「JLOI / SHOI2016」方

    #2025. 「JLOI / SHOI2016」方   题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形.上帝把我们派到了一个有 NNN ...

  5. loj2026 「JLOI / SHOI2016」成绩比较

    orz #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...

  6. 【LOJ】 #2025. 「JLOI / SHOI2016」方

    题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...

  7. 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫

    题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...

  8. loj2024「JLOI / SHOI2016」侦查守卫

    too hard #include <iostream> #include <cstdio> using namespace std; int n, d, m, uu, vv, ...

  9. Loj #2495. 「AHOI / HNOI2018」转盘

    Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...

随机推荐

  1. vue2.0项目实战(2)使用 vue-cli 搭建项目

    Vue-cli是官方推荐的快速构建单页应用的脚手架.官方给的建议,如果你是初次尝试Vue,哪就老老实实用普通的书写引入js文件,这里牵扯太多的东西,例如webpack .npm .nodejs 等等, ...

  2. bzoj2208 连通数(bitset优化传递闭包)

    题目链接 思路 floyd求一下传递闭包,然后统计每个点可以到达的点数. 会tle,用bitset优化一下.将floyd的最后一层枚举变成bitset. 代码 /* * @Author: wxyww ...

  3. listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示

    今天想做一个可编辑单元格的 listview,样式是 LVS_REPORT 与 LVS_EDITLABELS 网上搜索了一些相关资料,照葫芦画瓢写了一个,可测试的时候发现,当从第2列开始编辑的时候,第 ...

  4. MySQL的主从分离基本配置

    1.介绍 MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度.现在的网站一般大点的,都采用有数据库主从分离.读写分离,既起到备份作用也可以减轻数据库的 ...

  5. php mkdir No such file or director问题

    有时使用mkdir创建目录时会出现 No such file or director这样的错误,导致这个错误的原是 比如你要创建目录 a\b\c目录,但是创建时父目录b也不存在时就会出现这样的问题. ...

  6. grub.conf解析

    一.grub简介系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化 ...

  7. phpmyadmin拿webshell

    思路:就是利用mysql的一个日志文件.这个日志文件每执行一个sql语句就会将其执行的保存.我们将这个日志文件重命名为我们的shell.php然后执行一条sql带一句话木马的命令.然后执行菜刀连接之! ...

  8. scp从远程指定目录拷贝文件到本地指定目录

    scp从远程指定目录拷贝文件到本地指定目录 [root@picts ~]# cat /root/scp_pictures.sh #!/bin/bash # Function: copy files f ...

  9. u-boot(一)启动简介

    目录 u-boot(一)启动简介 启动概述 内部存储布局 Bootloader概述 内核启动参数 taggedlist 体验一下实际的Uboot U-boot的使用帮助 U-boot基本要求 titl ...

  10. 解决pycharm问题:module 'pip' has no attribute 'main'

    问题 更新pip之后,Pycharm安装package出现如下报错: 解决 找到安装目录下 helpers/packaging_tool.py文件,找到如下代码: 修改为如下,保存即可.