【容斥、插值】P3270 [JLOI2016]成绩比较

题目简述

  • 有 \(n+1\) 个人,进行 \(m\) 场考试,第 \(i\) 场考试的可能得分是 \([0,U_i]\) 之间的整数。
  • 假设你是其中一人,你知道每场考试的排名 \(r_i\)(相同分数算后排名),并且恰有 \(k\) 个人每一场考试的分数都不大于你。
  • 求方案数,对 \(10^9+7\) 取模。
  • \(n,m\leq 100\),\(U_i\leq10^9\)。

解题思路

很显然的计数分为三个部分:

  • 确定被你碾压的 \(k\) 人。
  • 确定每个人和你分数的大小关系。
  • 确定每个人的分数。

对于第 \(1\) 部分,显然是 \(C_n^k\)。

对于第 \(2\) 部分,我们可以通过排名确定出每场比赛 \(i\) 有多少人分数 $\leq $ 你,多少人分数 \(>\) 你。那么由于已经确定出 \(k\) 个被碾压的人了,所以这 \(k\) 个人的分数 $\leq $ 你,我们的问题转换成在剩下的人当中去分配 \(R_i\) 使得每个人至少有一个 \(>\) 你的分数。很显然的可以使用容斥。

由于 \(k\) 个被碾压者已经确定,记剩下的人 \(N=n-k\),假设有:

\[f_i=\prod_{j=1}^m C^{r_j-1}_{i}
\]

表示有至多 \(i\) 个人被你碾压,很显然的容斥为:

\[ans=\sum_{i=0}^N (-1)^{N-i}\times f_i\times C_{N}^i
\]

对于第三部分,每一场考试是独立的,我们可以写出式子:

\[\sum_{k=0}^{U_i} k^{n-r_i+1}\times (U_i-k)^{r_i-1}
\]

我们不难发现原式改写成 \(\sum_{k=0}^{x} k^{n-r_i+1}\times (U_i-k)^{r_i-1}\) 是关于 \(x\) 的 \(n+1\) 次多项式,所以我们对于 \(\leq n+2\) 的值暴力枚举,然后使用插值求出 \(x=U_i\) 的值即可。

暴力拉格朗日的复杂度 \(O(n^2\log V)\),可以通过。我们也可以优化到 \(O(n\log n)\) 的拉格朗日。

参考代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MP make_pair
const int MAXN=105;
const int MOD=1e9+7;
int n,m,k;
int x[MAXN],r[MAXN];
ll fac[MAXN],inf[MAXN];
ll ksm(ll a,int b){ll res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD,b>>=1;}return res;}
ll inv(ll a){return ksm(a,MOD-2);}
void init(){
fac[0]=inf[0]=1;
for(int i=1;i<MAXN;i++)
fac[i]=fac[i-1]*i%MOD,
inf[i]=inv(fac[i]);
return;
}
ll C(int n,int m){if(n>m) return 0;return fac[m]*inf[n]%MOD*inf[m-n]%MOD;}
ll sgn(int x){return (x&1)?-1:1;}
ll Part_2(){
ll f[MAXN];
for(int i=0;i<=n;i++){
f[i]=1;
for(int j=1;j<=m;j++)
f[i]=f[i]*C(r[j]-1,i)%MOD;
}
ll res=0;
int d=n-k;
for(int i=0;i<=d;i++)
res=(res+sgn(d-i)*f[i]%MOD*C(i,d)%MOD+MOD)%MOD;
return res;
}
ll Func(ll x,int a,int b){
ll y[MAXN],res=0;
for(int i=1;i<=n+2;i++){
res+=ksm(i,a)*ksm(x-i+MOD,b)%MOD;
res%=MOD;
y[i]=res;
}
ll ans=0;
for(int i=1;i<=n+2;i++){
res=y[i];
for(int j=1;j<=n+2;j++)
if(i!=j)
res=res*(x-j+MOD)%MOD*inv(i-j+MOD)%MOD;
ans+=res;ans%=MOD;
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
init();
cin>>n>>m>>k;n--;
for(int i=1;i<=m;i++)
cin>>x[i];
for(int i=1;i<=m;i++)
cin>>r[i];
ll ans=C(k,n)*Part_2()%MOD;
for(int i=1;i<=m;i++)
ans=ans*Func(x[i],n-r[i]+1,r[i]-1)%MOD;
cout<<ans;
return 0;
}

【容斥、插值】P3270 [JLOI2016]成绩比较的更多相关文章

  1. 洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)

    题面传送门 考虑容斥.我们记 \(a_i\) 为钦定 \(i\) 个人被 B 神碾压的方案数,如果我们已经求出了 \(a_i\) 那么一遍二项式反演即可求出答案,即 \(ans=\sum\limits ...

  2. LG4781 【模板】拉格朗日插值 和 JLOI2016 成绩比较

    [模板]拉格朗日插值 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$ ...

  3. BZOJ4559&P3270[JLoi2016]成绩比较

    题目描述 \(G\)系共有\(n\)位同学,\(M\)门必修课.这\(N\)位同学的编号为\(0\)到\(N-1\)的整数,其中\(B\)神的编号为\(0\)号.这\(M\)门必修课编号为\(0\)到 ...

  4. P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值

    LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...

  5. P3270 [JLOI2016]成绩比较(拉格朗日插值)

    传送门 挺神仙的啊-- 设\(f[i][j]\)为考虑前\(i\)门课程,有\(j\)个人被\(B\)爷碾压的方案数,那么转移为\[f[i][j]=\sum_{k=j}^{n-1}f[i-1][k]\ ...

  6. BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...

  7. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  8. 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学

    [BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...

  9. ●BZOJ 4559 [JLoi2016]成绩比较(容斥)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 容斥,拉格朗日插值法. 结合网上的另一种方法,以及插值法,可以把本题做到 O( ...

  10. bzoj4558[JLoi2016]方 容斥+count

    4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 452  Solved: 205[Submit][Status][D ...

随机推荐

  1. Git的使用(一):创建本地仓库并在其中添加、修改、删除文件

    创建本地版本库 版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者 ...

  2. 使用Git 命令行拉取、提交、推送、合并 代码

    1.拉取 1.1.拉取该分支的最新代码(远程分支是与当前分支相同) git pull origin updateCode 1.2.拉取最新代码(远程分支是与当前分支不相同,但要合并) git pull ...

  3. Redis订阅模式在生产环境引起的内存泄漏

    内存泄漏 内存泄漏指的就是在运行过程中定义的各种各样的变量无法被垃圾回收器正常标记为不可达并触发后续的回收流程,主要原因还是因为对可回收对象引用没有去除,导致垃圾回收器通过GC ROOT可达性分析时认 ...

  4. 我管你什么okr还是kpi,PPT轻松交给你

    word一键转ppt 通过[文件]→[选项]→[快速访问工具栏],选择[不在功能区中的命令],找到[发送到Microsoft PowerPoint ],单击[添加]后再[确定] 调出功能按钮后,就可以 ...

  5. 6、后端学习规划:Java学习 - 学习规划系列文章

    Java语言在现在的编程语言排行榜上也是前5的存在.经过这么些年的发展,Java的发展没有C#这么大,但是在编程领域,因为有MVC架构,以及Spring框架的支持,以及微服务架构等等,Java这些年也 ...

  6. Java 数字 默认是 Integer类型的问题,System.currentTimeMillis() + (180 * 24 * 60 * 60 * 1000)的问题,剖析、Long + Integer的问题

    最终结论: (180 * 24 * 60 * 60) 这种计算表达式在 Java中是默认以 Integer类型来的,若不超过 Integer的最大值则没有问题,若超过则必须用 (180 * 24 * ...

  7. LVM(逻辑卷管理器)

    目录 一.LVM概述 二.基本术语 三.PE.PV.VG.LV之间的关系 四.LVM的工作原理 五.LVM的使用 1.部署逻辑卷 第一步: 还原快照,并在虚拟机添加两块新硬盘设备,开机 第二步: 让新 ...

  8. NC15136 迷宫

    题目链接 题目 题目描述 这是一个关于二维迷宫的题目.我们要从迷宫的起点 'S' 走到终点 'E',每一步我们只能选择上下左右四个方向中的一个前进一格. 'W' 代表墙壁,是不能进入的位置,除了墙壁以 ...

  9. Laravel入坑指南(9)——数据迁移与填充

    当我们开发完成一个(小)项目,发布到线上时,我们需要将本地数据库迁移到服务器上,并且填充初始化数据.而Laravel框架规定了一套完善的数据迁移与填充机制. 在官网中分别介绍了以下四个命令: php ...

  10. SpringCloud SpringBoot 组件使用:SpringBoot Actuator

    基础篇 一.什么是Spring Actuator? spring-boot-starter-actuator模块是一个spring提供的监控模块.我们在开运行发过程中,需要实时和定时监控服务的各项状态 ...