P3270 [JLOI2016]成绩比较(拉格朗日插值)
挺神仙的啊……
设\(f[i][j]\)为考虑前\(i\)门课程,有\(j\)个人被\(B\)爷碾压的方案数,那么转移为$$f[i][j]=\sum_{k=j}^{n-1}f[i-1][k]\times {k \choose k-j}\times {n-1-k \choose r[i]-1-(k-j)}\times g(i)$$
解释一下,就是考虑第\(i\)门课,枚举在这之前分比\(B\)爷高的人数\(k\),要从中选出\(k-j\)个使得他们这一门课的分数比\(B\)爷高,然后在剩下的\(n-1-k\)个人里选出\(r[i]-1-(k-j)\)个人使他们比\(B\)爷分数高
最后的\(g(i)\)表示对于第\(i\)门课程,把\(1\)到\(u[i]\)的分数分给\(n-1\)个人使得他们中比\(B\)爷分数高的人数为\(r[i]\)的方案数
可以枚举\(B\)爷的分数,得$$g[i]=\sum_{k=1}{u_i}k{n-r[i]}(u_i-k)^{r[i]-1}$$
然而\(u_i\)太大不好直接算,发现后面那东西是一个多项式,且多项式的次数为\(n-1\),所以可以用拉格朗日插值快速计算
//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=155,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int C[N][N],f[N][N],u[N],r[N],g[N];
int n,m,k;
int Large(int d,int r){
fp(i,0,n){
g[i]=0;
fp(j,1,i)g[i]=add(g[i],1ll*ksm(j,n-r)*ksm(i-j,r-1)%P);
}if(d<=n)return g[d];
int res=0,ty=(n&1)?P-1:1,tmp=1;
fp(i,1,n)tmp=1ll*tmp*(d-i)%P*ksm(i,P-2)%P;
fp(i,0,n){
res=add(res,1ll*g[i]*ty%P*tmp%P);
tmp=1ll*tmp*(d-i)%P*ksm(d-i-1,P-2)%P*(n-i)%P*ksm(i+1,P-2)%P;
ty=P-ty;
}return res;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),k=read();
fp(i,1,m)u[i]=read();
fp(i,1,m)r[i]=read();
fp(i,0,N-5){
C[i][0]=1;
fp(j,1,i)C[i][j]=add(C[i-1][j],C[i-1][j-1]);
}
f[0][n-1]=1;
fp(i,1,m){
int res=Large(u[i],r[i]);
fp(j,k,n-1){
fp(l,j,n-1)if(l-j<=r[i]-1)
f[i][j]=add(f[i][j],1ll*f[i-1][l]*C[l][l-j]%P*C[n-1-l][r[i]-1-(l-j)]%P);
f[i][j]=mul(f[i][j],res);
}
}printf("%d\n",f[m][k]);return 0;
}
P3270 [JLOI2016]成绩比较(拉格朗日插值)的更多相关文章
- bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...
- P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值
LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...
- 洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)
题面传送门 考虑容斥.我们记 \(a_i\) 为钦定 \(i\) 个人被 B 神碾压的方案数,如果我们已经求出了 \(a_i\) 那么一遍二项式反演即可求出答案,即 \(ans=\sum\limits ...
- BZOJ4559&P3270[JLoi2016]成绩比较
题目描述 \(G\)系共有\(n\)位同学,\(M\)门必修课.这\(N\)位同学的编号为\(0\)到\(N-1\)的整数,其中\(B\)神的编号为\(0\)号.这\(M\)门必修课编号为\(0\)到 ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- BZOJ4599[JLoi2016&LNoi2016]成绩比较(dp+拉格朗日插值)
这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][ ...
- bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...
- LG4781 【模板】拉格朗日插值 和 JLOI2016 成绩比较
[模板]拉格朗日插值 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$ ...
- BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)
BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...
随机推荐
- EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603 Demo项目介绍 EasyRTMP Demo代码下载地址https://github.c ...
- EasyDarwin开源流媒体服务器提供的RTMP直播推送库
EasyRTMP EasyRTMP是什么? EasyRTMP是一个EasyDarwin配套使用,也可以单独使用的RTMP推送库,通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送流程,只需 ...
- WSDL文档深入分析
借助jdk的wsimort.exe工具生成客户端代码 格式:wsimport -keep url //url为wsdl文件的路径 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法: 将 ...
- ubuntu下安装android模拟器genymotion【转】
本文转载自:http://www.jianshu.com/p/e6062ebb8fc9 去genymotion下载对应的安装包genymotion-2.4.0_x64.bin sudo ./genym ...
- SDUT OJ 进制转换
进制转换 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入一个十进制数N,将它转换成R进制数输出. 输入 输入数据包含多个测试实例,每个测试实例包含两个整 ...
- 分布式锁(Zookeeper实现)
分布式锁 分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性.锁服务可以分为两类,一个是 保持独占,另一个是 控制时序. 1. 所谓保持独占,就是所有试图来获取这个锁的客户端,最 ...
- 解决LoadRunner超时错误
在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同. 错误现象1:Action.c(16): Error -27728: Step download timeout ...
- php的CURL使用及例子
使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把 ...
- im资源
https://github.com/oikomi/FishChatServer https://github.com/subrosa-io https://github.com/WhisperSys ...
- linux安装netcat 运行udp服务器
liunx下安装netcat 1.下载安装包 wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1. ...