【容斥、插值】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. 使用Lua做为MMOARPG游戏逻辑开发脚本的一点体会

    项目背景 目前在一个大型MMOARPG游戏中使用Lua做为逻辑开发语言,Lua占整体代码量的80%. 我们这个MMO游戏开发近2年,客户端8人,项目组总体人数在100人(美术占70%),目前代码量很大 ...

  2. springboot多模块打包报错问题根因分析:Unable to find main class

    问题背景: 项目结构为springboot多模块,其中有四个模块bean.utils.user.ems,其中user和ems模块为主程序,包含启动类,其他两个模块为其服务,提供依赖 问题分析: 查看u ...

  3. 【三】分布式训练---单机多卡与多机多卡组网(飞桨paddle2.0+)更加推荐spawn方式!

    1. 单机多卡启动并行训练 飞桨2.0增加paddle.distributed.spawn函数来启动单机多卡训练,同时原有的paddle.distributed.launch的方式依然保留. padd ...

  4. 人工智能创新挑战赛:海洋气象预测Baseline[4]完整版(TensorFlow、torch版本)含数据转化、模型构建、MLP、TCNN+RNN、LSTM模型训练以及预测

    人工智能创新挑战赛:海洋气象预测Baseline[4]完整版(TensorFlow.torch版本)含数据转化.模型构建.MLP.TCNN+RNN.LSTM模型训练以及预测 1.赛题简介 项目链接以及 ...

  5. 深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,Dropout,Drop Connect】等

    深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力.自注意力],正则化[L1.L2,Dropout,Drop Connect]等 1.注意力机制 在深度学习领域,模型往往需要接收和处理大 ...

  6. 14.6 Socket 应用结构体传输

    当在套接字编程中传输结构体时,可以将结构体序列化为字符串(即把结构体的所有成员打包成一个字符串),然后将字符串通过套接字传输到对端,接收方可以将字符串解析为结构体,然后使用其中的成员数据.这种方法通常 ...

  7. GD库常用实例

      GD库常用实例 一.图片水印 1.实现步骤 打开原图(也叫操作的目标图片) 打开水印图(也叫水印来源图片) 使用 imagecopymerge 将小图合并至大图的指定位置 输出图片 销毁资源 2. ...

  8. Kafka的ACK机制

    Kafka的ack机制,指的是producer的消息发送确认机制,这直接影响到Kafka集群的吞吐量和消息可靠性.而吞吐量和可靠性就像硬币的两面,两者不可兼得,只能平衡. ACK有3个可选值,分别是1 ...

  9. FreeSWITCH在session上执行特定dialplan

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 日常开发中,会遇到需要在已存在的session上执行特定拨号方案的情况,今天整理下这方面的内容,我将从以下几个方面进 ...

  10. NC24870 [USACO 2009 Dec G]Video Game Troubles

    题目链接 题目 题目描述 Farmer John's cows love their video games! FJ noticed that after playing these games th ...