【BZOJ4559】[JLoi2016]成绩比较

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神那么厉害,你只需要计算出情况数模10^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

题解:本题可以分为两部分处理,答案等于两部分的方案数之积。

第一部分是在碾压K个人的前提下,所有人每门课的分数与B神分数的大小关系的方案数。不难想到容斥,用f[i]表示至少碾压了i个人的方案数,那么$f[i]=C_{n-1}^i\prod\limits_{j=1}^mC_{n-i-1}^{Rj-1}$。答案=至少碾压K个人-至少碾压K+1个人+至少碾压K+2个人。。。所以$ans1=\sum\limits_{i=K}^n(-1)^{K-i}C_i^kf[i]$。

第二部分是在已经确定所有人每门课与B神的相对关系的情况下,每个人得分的方案数。我们可以先分别计算每门课的方案数,最后将其乘起来。设当前课B神的排名为R,总分为U。一个比较暴力的方法就是我们枚举B神的得分x,那么方案数就是$x^{n-R}(U-x)^{R-1}$。所以这门课的总方案数就是:

$\sum\limits_{x=1}^Ux^{n-R}(U-x)^{R-1}\\=\sum\limits_{x=1}^U\sum\limits_{k=0}^{R-1}(-1)^kC_{R-1}^kU^{R-1-k}x^{n-R+k}\\=\sum\limits_{k=0}^{R-1}(-1)^kC_{R-1}^kU^{R-1-k}\sum\limits_{x=1}^Ux^{n-R+k}$

所以现在问题就在于如何快速求$\sum\limits_{i=1}^si^k$,我们设这个东西=g[k]。下面这步非常神:我们观察这个式子

$(s+1)^k-s^k=\sum\limits_{j=0}^{k-1}C_k^js^j\\s^k-(s-1)^k=\sum\limits_{j=0}^{k-1}C_k^j(s-1)^j\\...\\2^k-1^k=\sum\limits_{j=0}^{k-1}C_k^j1^j$

等式两边分别求和

$\sum\limits_{i=1}^s(i+1)^k-i^k=\sum\limits_{i=1}^{s}\sum\limits_{j=0}^{k-1}C_k^ji^j\\(s+1)^k-1=\sum\limits_{j=0}^{k-1}C_k^j\sum\limits_{i=1}^si^j=\sum\limits_{j=0}^{k-1}C_k^jg[j]$

将g[k-1]放到左面即可得

$g[k-1]=\frac {(s+1)^k-1-\sum\limits_{j=0}^{k-2}C_k^jg[j]} {C_k^{k-1}}$

递推求出g[k]即可。

时间复杂度$O(n^3)$。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007; int n,m,K;
ll ans1,ans2;
int R[110];
ll c[110][110],f[110],U[110],g[110];
inline ll pm(ll x,ll y)
{
ll z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),K=rd(),ans2=1;
int i,j,k;
for(i=0;i<=max(n,m);i++)
{
c[i][0]=1;
for(j=1;j<=i;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%P;
}
for(i=1;i<=m;i++) U[i]=rd();
for(i=1;i<=m;i++) R[i]=rd();
for(i=n-1;i>=K;i--)
{
f[i]=c[n-1][i];
for(j=1;j<=m;j++) f[i]=f[i]*c[n-i-1][n-R[j]-i]%P;
ans1=(ans1+(((i^K)&1)?-1:1)*f[i]*c[i][K]%P+P)%P;
}
for(i=1;i<=m;i++)
{
ll tmp=0;
g[0]=U[i];
for(k=1;k<=n;k++)
{
g[k]=(pm(U[i]+1,k+1)-1+P)%P;
for(j=0;j<k;j++) g[k]=(g[k]-c[k+1][j]*g[j]%P+P)%P;
g[k]=g[k]*pm(c[k+1][k],P-2)%P;
}
for(j=0;j<=R[i]-1;j++) tmp=(tmp+((j&1)?-1:1)*c[R[i]-1][j]*pm(U[i],R[i]-j-1)%P*g[n-R[i]+j]%P+P)%P;
ans2=ans2*tmp%P;
}
printf("%lld",ans1*ans2%P);
return 0;
}

【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学的更多相关文章

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

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

  2. 2015 asia xian regional F Color (容斥 + 组合数学)

    2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...

  3. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  4. BZOJ4559 JLOI2016成绩比较(容斥原理+组合数学+斯特林数)

    容斥一发改为计算至少碾压k人的情况数量,这样对于每门课就可以分开考虑再相乘了.剩下的问题是给出某人的排名和分数的值域,求方案数.枚举出现了几种不同的分数,再枚举被给出的人的分数排第几,算一个类似斯特林 ...

  5. BZOJ2839:集合计数(容斥,组合数学)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...

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

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

  7. 容斥 + 组合数学 ---Codeforces Round #317 A. Lengthening Sticks

    Lengthening Sticks Problem's Link: http://codeforces.com/contest/571/problem/A Mean: 给出a,b,c,l,要求a+x ...

  8. Gym 100548F Color 给花染色 容斥+组合数学+逆元 铜牌题

    Problem F. ColorDescriptionRecently, Mr. Big recieved n flowers from his fans. He wants to recolor th ...

  9. [CTS2019]随机立方体(容斥+组合数学)

    这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪.发现直接做不行,那么,容斥! f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不 ...

随机推荐

  1. linux 获取随机数的办法

    1.1.1 inux随机数的办法  http://www.2cto.com/kf/201410/342717.html 方法一.[root@ob ~]# date +%N  %N纳秒  随机获取的九位 ...

  2. MongoDB(五):MongoDB操作文档

    本篇文章中将讲解如何使用MongoDB操作文档. 文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式.BSON是一种类似json格式的一种二进制形式的存储格式,简称Binary ...

  3. Entity Framework管理实体关系(二):管理一对二关系

    在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系. 要在数据库中配置一对多关系,我们可以依赖EF约定,还 ...

  4. 用大白话揭开Ajax长轮询(long polling)的神秘面纱

    在看这篇Ajax长轮询之前可以先看看Ajax轮询技术(没有长),有助于理解: Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快. "不间断的通 ...

  5. Qt中Pro文件变量详细说明

    学习Qt时,发现有些知识看了不经常用就忘了,以下是书本上写的一些关于qmake的相关知识,自己看后,打算把一些经常用到的记下来,整理整理. Qt程序一般使用Qt提供的qmake工具来编译. qmake ...

  6. e595. Drawing an Image

    See also e575 The Quintessential Drawing Program and e594 Reading an Image or Icon from a File. publ ...

  7. Mysql经常使用基本命令汇总及默认账户权限与改动

    一直仅仅是在浅显利用数据库存储数据.也被windows惯坏了.非常多命令使用的时候记不起来.so,换LINUX系统!不再使用GUI管理数据库!也想深入学习下Mysql.从权限管理開始.也就诞生了这篇学 ...

  8. Unity3d之Shader开发介绍

    Shader是为渲染管线中的特定处理阶段提供算法的一段代码.shader是伴随着可编程渲染管线出现的,它的出现使得游戏开发者可以对渲染过程加以控制,拥有更大的创作空间,因此Shader的出现可以看作是 ...

  9. 远程连接mysql数据库提示:ERROR 1130的解决办法

    From: http://blog.sina.com.cn/s/blog_716844910100welz.html 在linux下使用mysql客户端连接远程mysql服务器报错: [root@Se ...

  10. Win10開始菜单打不开

    一.前言 自从用Win10之后(附上<我的Win10之旅>).用清理软件.总是深度清理,导致rt问题. 每次百度都是没用的解决方法: 今天,再一次清理(Wise Care 365 注冊表深 ...