http://www.lydsy.com/JudgeOnline/problem.php?id=4559

f[i][j] 表示前i门课,有j个人没有被碾压的方案数

g[i] 表示第i门课,满足B神排名的分数安排方案数

g[i]的求法:

枚举B神这门课x分,则有n-Ri个人的分数<=x ,Ri-1个人的分数>x

Ui 上限是1e9,但是g[i] 是一个关于Ui 的n次多项式,所以可以用拉格朗日插值法来求

递推 f[i][j]:

假设f[i-1][w] 转移到了f[i][j],j>=w

前i-1门课没有被碾压,前i门课也一定没有被碾压

前i-1门课被碾压,前i门课可能继续被碾压,也可能不再被碾压

单看这一门课有Ri-1个人的成绩比B神高

但这Ri-1个人之前可能就有科目比B神高,已经不被碾压,这次成绩比B神高还是低都行

所以实际新增加了j-w个没有被碾压的,即这j-w个人 这一门 的成绩比B神高,之前的科目都比B神低

在已经没有被碾压的w个人中,还存在 Ri-1-(j-w) 个人的成绩比B神高

之前有n-w-1个人被碾压,所以新增情况的方案数为C(n-w-1,j-w)

后一种情况的方案数为C(w,Ri-1-j+w)

#include<cstdio>
#include <iostream> using namespace std; const int mod=1e9+; #define N 101 int C[N][N];
int U[N],rk[N];
int f[N][N];
int g[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int get_C(int n,int m)
{
if(n< || m< || n<m) return ;
return C[n][m];
} void pre_C()
{
C[][]=;
for(int i=;i<=;++i)
{
C[i][]=;
for(int j=;j<=i;++j)
C[i][j]=(C[i-][j-]+C[i-][j])%mod;
}
} int Pow(int a,int b)
{
int res=;
for(;b;a=1LL*a*a%mod,b>>=)
if(b&) res=1LL*res*a%mod;
return res;
} int Langrange(int n,int r,int k)
{
for(int u=;u<=k;++u)
{
g[u]=;
for(int x=;x<=u;++x)
g[u]=(g[u]+1LL*Pow(u-x,r-)*Pow(x,k--r)%mod)%mod;
if(n==u) return g[u];
}
int fz=;
for(int i=;i<=k;++i) fz=1LL*fz*(n-i)%mod;
int fm,ans=;
for(int i=;i<=k;++i)
{
fm=n-i;
for(int j=;j<=k;++j)
if(i!=j) fm=1LL*fm*(i-j)%mod;
ans=(ans+1LL*fz*g[i]%mod*Pow(fm,mod-)%mod)%mod;
}
if(ans<) ans+=mod;
return ans;
} int main()
{
int n,m,k;
read(n); read(m); read(k);
for(int i=;i<=m;++i) read(U[i]);
for(int i=;i<=m;++i) read(rk[i]);
pre_C();
int G;
f[][]=;
for(int i=;i<=m;++i)
{
G=Langrange(U[i],rk[i],n+);
for(int j=;j<=n;++j)
{
for(int w=;w<=j;++w)
f[i][j]=(f[i][j]+1LL*f[i-][w]*get_C(w,rk[i]--j+w)%mod*get_C(n-w-,j-w)%mod)%mod;
f[i][j]=1LL*f[i][j]*G%mod;
}
}
printf("%d",f[m][n-k-]);
return ;
}

4559: [JLoi2016]成绩比较

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 366  Solved: 211
[Submit][Status][Discuss]

Description

G系共有n位同学,M门必修课。这N位同学的编号为0到N-1的整数,其中B神的编号为0号。这M门必修课编号为0到M-
1的整数。一位同学在必修课上可以获得的分数是1到Ui中的一个整数。如果在每门课上A获得的成绩均小于等于B获
得的成绩,则称A被B碾压。在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没
有被他碾压。D神查到了B神每门必修课的排名。这里的排名是指:如果B神某门课的排名为R,则表示有且仅有R-1
位同学这门课的分数大于B神的分数,有且仅有N-R位同学这门课的分数小于等于B神(不包括他自己)。我们需要
求出全系所有同学每门必修课得分的情况数,使其既能满足B神的说法,也能符合D神查到的排名。这里两种情况不
同当且仅当有任意一位同学在任意一门课上获得的分数不同。你不需要像D神那么厉害,你只需要计算出情况数模1
0^9+7的余数就可以了。

Input

第一行包含三个正整数N,M,K,分别表示G系的同学数量(包括B神),必修课的数量和被B神碾压的同学数量。第二
行包含M个正整数,依次表示每门课的最高分Ui。第三行包含M个正整数,依次表示B神在每门课上的排名Ri。保证1
≤Ri≤N。数据保证至少有1种情况使得B神说的话成立。N<=100,M<=100,Ui<=10^9

Output

仅一行一个正整数,表示满足条件的情况数模10^9+7的余数。

Sample Input

3 2 1
2 2
1 2

Sample Output

10

bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

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

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

  3. bzoj千题计划281:bzoj4558: [JLoi2016]方

    http://www.lydsy.com/JudgeOnline/problem.php?id=4558 容斥原理 全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少 ...

  4. bzoj千题计划272:bzoj4557: [JLoi2016]侦察守卫

    http://www.lydsy.com/JudgeOnline/problem.php?id=4557 假设当前到了x的子树,现在是合并 x的第k个子树 f[x][j] 表示x的前k-1个子树该覆盖 ...

  5. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  6. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  7. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  8. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  9. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

随机推荐

  1. Java使用Redis学习笔记

    如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <dependency ...

  2. win10系统安装web3js的正确方法

    在安装web3的时候 用npm  install web3 –save-dev 在win10系统下会一直安装不成功.后来换用了 cnpm install web3 –save-dev 安装时候报出:C ...

  3. JS高级程序设计学习笔记1

    javascript产生的原因: 在拨号上网时代,表单数据必须发送到服务器端才能验证输入值得有效性,JavaScript的研发就是为了解决这个问题,以便在客户端就验证输入值的有效性. ECMAScri ...

  4. linux内核分析第三周

    20135103王海宁 linux内核分析第三周 http://mooc.study.163.com/course/USTC-1000029000  按照课堂提供的方法,命令行一行行敲上去,我是手机缓 ...

  5. 《Linux内核设计与实现》第一、二章学习笔记

    <Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡  学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态 ...

  6. Linux第五周学习总结——扒开系统调用的三层皮(下

    Linux第五周学习总结--扒开系统调用的三层皮(下) 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  7. 第一章:帝国的余晖 AT&T公司

    启示:自己的想法,有好的技术比什么都重要,一定要注意的是技术,不要贪小便宜,明白自己最先关心的的哪个事情. 书中内容:没有人能活两百岁,也没有公司能辉煌两百年,这就是规律,很难超越.

  8. ElasticSearch 2 (34) - 信息聚合系列之多值排序

    ElasticSearch 2 (34) - 信息聚合系列之多值排序 摘要 多值桶(terms.histogram 和 date_histogram)动态生成很多桶,Elasticsearch 是如何 ...

  9. 异构数据库之间完全可以用SQL语句导数据

    告诉你一个最快的方法,用SQLServer连接DBF 在SQLServer中执行 SELECT * into bmk FROM OpenDataSource( ‘Microsoft.Jet.OLEDB ...

  10. Java获取当前运行方法所在的类和方法名

    很简单,直接看代码: public void showClassAndMethod() { System.out.println(this.getClass().getSimpleName() + & ...