传送门

挺神仙的啊……

设\(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]成绩比较(拉格朗日插值)的更多相关文章

  1. bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...

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

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

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

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

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

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

  5. bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...

  6. BZOJ4599[JLoi2016&LNoi2016]成绩比较(dp+拉格朗日插值)

    这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][ ...

  7. bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...

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

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

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

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

随机推荐

  1. Dropout: A Simple Way to Prevent Neural Networks fromOverfitting

    https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf Deep neural nets with a large number of par ...

  2. Mac 下Java开发环境安装

    一.安装Eclipse 1.官网下载安装文件 http://www.eclipse.org/downloads 2.eclipse安装svn插件 这里须要注意安装的svn的版本号.要和后面的安装的Ja ...

  3. jQuery局部动态刷新

    AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新. 在做项目的过程当中要用到jQuery动态刷新获取数据,上网查了一番教程,讲此知识点的教程很多,但个人感觉比较乱 ...

  4. 关于“telnet localhost:8080不能打开到主机的连接, 在端口 23: 连接失败”问题

    你的命令写错了!不是telnet localhost:1433 是 telnet localhost 1433 不要那个:号 http://www.fengfly.com/ 答案补充 :“正在连接到l ...

  5. linux3 源代码安装

    源代码安装: 通过yum就不会有依赖关系(安装mysql是安装mysqlServer).Rpm更新的时候,如果没有安装软件就回去安装. 应用程序和系统命令会放在不同的目录中(bin,sbin,usr/ ...

  6. HDU 5969 最大的位或 —— 贪心 + 二进制的理解

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5969 最大的位或 Time Limit: 2000/1000 MS (Java/Others)     ...

  7. MySQL学习笔记(五)—— 子查询及联结

    子查询: 子查询,即嵌套在其他查询中的查询.例如我们有这样几个表,顾客表,订单表,商品表,我们想知道有哪些客户买了商品A,那么我们就需要先查看哪些订单里包含了商品A,然后根据订单查出是哪些客户. my ...

  8. 用python做自动化测试--Python实现远程性能监控

    http://blog.csdn.net/powerccna/article/details/8044222 在性能测试中,监控被测试服务器的性能指标是个重要的工作,包括CPU/Memory/IO/N ...

  9. Java类加载器回顾

    Java类加载采用了全盘委托机制,默认加载类时子类先会委托给父类加载,但父类加载不到时,子类才会自己尝试加载类.这种机制可以有效防止一个类被加载多次,同时也一定程度上防止重写JDK自身的类[Java自 ...

  10. rsync(三)算法原理和工作流程分析

    在开始分析算法原理之前,简单说明下rsync的增量传输功能. 假设待传输文件为A,如果目标路径下没有文件A,则rsync会直接传输文件A,如果目标路径下已存在文件A,则发送端视情况决定是否要传输文件A ...