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
  首先发现对于n个确定排名的人,分数和其排名无关,这里可以分开处理。
  有两种做法,第一种我分成三个集合,1:我 2:分数小于等于我的3:分数大于等于我的。
  设f[i]表示完虐至少i人,三个集合内无名次顺序的方案数,可以发现容斥是能很好地解决这个分问题的。
  转移是f[i]=C(n-1,i)*Σj=1,j<=mC(n-i-1,r[j]-1)-Σj=i+1,j<=nf[j]*C(j,i) 这个很容易推得。
  然后发现每门的得分情况互不相关,符合乘法原理,我们分开处理,设当前科目排名r,得分上限u,我的得分是x。方案数是 xn-r(u-x)r-1 但是u太大了,x的取值是[1,u],不可能枚举得来,还得分析。
  设t[x]=xn-r(u-x)r-1
  =xn-r *(C(r-1,r-1)*ur-1-C(r-1,r-2)*ur-2*x+……+C(r-1,0)*xr-1)
  =C(r-1,r-1)*ur-1*xn-r-C(r-1,r-2)*ur-2*xn-r+1+……+C(r-1,0)*xn-1
  x=1:请自动脑补
  x=2:请自动脑补
  x=3:请自动脑补
  ……
  x=u:请自动脑补
  设g[k]=1k+2k+3k+……+uk
  Σx=1,x<=ut[x]=C(r-1,r-1)*ur-1*g[n-r]-C(r-1,r-2)*ur-2*xn-r+1*g[n-r+1]+……+C(r-1,0)*xn-1*g[n-1]
  现在只要知道如何求g[k],考虑递推。
  发现设p[a+1]=(a+1)k=C(k,k)*ak+C(k,k-1)*ak-1+……+C(k,0)*a0
  Σa=1,a<=up[a+1]=g[k]+(u+1)k-1=C(k,k)*g[k]+C(k,k-1)*g[k-1]+……+C(k,0)*g[0]
  可以由 (u+1)k-1=C(k,k-1)*g[k-1]+……+C(k,0)*g[0]
  移项得 g[k-1]=(u+1)k-1-(C(k,k-2)*g[k-2]+C[k,k-3]*g[k-3]+……+C[k,0]*g[0])
  用k=k+1替入得:g[k]=(u+1)k+1-1-(C(k+1,k-1)*g[k-1]+C[k+1,k-2]*g[k-2]+……+C[k+1,0]*g[0])
 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=,Mod=;
int n,m,K,u[N],r[N];
typedef long long LL;
LL fac[N],ifac[N],c[N][N],f[N],g[N];
LL Inv(LL x){return x==?:(Mod-Mod/x)*Inv(Mod%x)%Mod;}
LL C(int x,int y){
if(x<y||x<||y<)return ;
return fac[x]*ifac[y]%Mod*ifac[x-y]%Mod;
} LL Quick_pow(LL x,LL y){
LL ret=;
while(y){
if(y&)ret=ret*x%Mod;
y>>=;x=x*x%Mod;
}
return ret;
} int main(){
scanf("%d%d%d",&n,&m,&K);
for(int i=;i<=m;i++)
scanf("%d",&u[i]);
for(int i=;i<=m;i++)
scanf("%d",&r[i]);
fac[]=ifac[]=;
for(int i=;i<N;i++){
fac[i]=fac[i-]*i%Mod;
ifac[i]=Inv(fac[i]);
}
for(int i=n-;i>=K;i--){
f[i]=C(n-,i);
for(int j=;j<=m;j++)
(f[i]*=C(n-i-,r[j]-))%=Mod;
for(int j=i+;j<n;j++){
(f[i]-=f[j]*C(j,i))%=Mod;
(f[i]+=Mod)%=Mod;
}
}
LL ans=f[K];
for(int i=;i<=m;i++){
LL R=r[i],U=u[i];
g[]=U;
for(int k=;k<=n;k++){
g[k]=Quick_pow(U+,k+)-;
for(int j=k-;j>=;j--)
(g[k]+=Mod-C(k+,j)*g[j]%Mod)%=Mod;
(g[k]*=Inv(C(k+,k)))%=Mod;
}
LL tmp=,rmp;
for(int j=,s=;j<=R;s*=-,j++){
rmp=(s+Mod)*C(R-,j-)%Mod;
(rmp*=Quick_pow(U,R-j))%=Mod;
(rmp*=g[n-R+j-])%=Mod;
(tmp+=rmp)%=Mod;
}
ans=ans*tmp%Mod;
}
printf("%lld\n",ans);
return ;
}
  
  

动态规划(计数DP):JLOI 2016 成绩比较的更多相关文章

  1. [JLOI 2016]成绩比较

    Description 题库链接( \(\text{bzoj}\) 不知道为什么过不了啊... \(\text{luogu loj}\) 都能过...就给 \(\text{luogu}\) 的链接了. ...

  2. Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits)

    Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits) 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数 ...

  3. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  4. 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)

    Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...

  5. HDU5800 To My Girlfriend 背包计数dp

    分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...

  6. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. [DP之计数DP]

    其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...

  8. HDU4815/计数DP

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815] 简单说一下题意: 有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A ...

  9. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

随机推荐

  1. JamCam创业故事:辞掉工作,去开发一个应用

    编者按:这是JamCam创始人的自述.这家初创公司提供的应用很简单,但是极为成功:有了JamCam,你所录制的视频会自动添加你正在iPhone中聆听的音乐,作为视频的背景音乐.和朋友分享时是不是方便多 ...

  2. HDU 3555 Bomb (数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:从0开始到给定的数字N所有的数字中遇到“49”的数字的个数. Sample Input ...

  3. 暑假集训(2)第九弹 ----- Points on Cycle(hdu1700)

                                                Points on Cycle Time Limit:1000MS     Memory Limit:32768 ...

  4. leetcode169——Majority Element (C++)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  5. 桶排序之python实现源码

    tmp = [] def bucket_sort(old): for i in range(len(old)): tmp.append([]) for i in old: tmp[int( i * l ...

  6. 模板:优先队列(priority_queue)

    #include <iostream> #include <cstdio> #include <queue> #include <vector> usi ...

  7. Android Activity 生命周期详解

    学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...

  8. Javascript自执行匿名函数(function() { })()的原理浅析

    匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一 ...

  9. Python全栈开发-web框架之django

    一:web框架 什么是web框架? Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通 ...

  10. 3D 服务器端以向量计算为主的角色位置的算法

    把我以前学习过的一个东西拿出来分享下~ 3D服务器端玩家行走处理是服务器端根据客户端行走路径.玩家行走时间以及速度(包括变化速度)计算得出玩家的当前位置. 由于客户端行走是一条路径,不使用2D中的格子 ...