【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
【BZOJ4559】[JLoi2016]成绩比较
Description
Input
Output
仅一行一个正整数,表示满足条件的情况数模10^9+7的余数。
Sample Input
2 2
1 2
Sample Output
题解:本题可以分为两部分处理,答案等于两部分的方案数之积。
第一部分是在碾压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]成绩比较 动态规划+容斥+组合数学的更多相关文章
- BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)
BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...
- 2015 asia xian regional F Color (容斥 + 组合数学)
2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...
- bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法
4559: [JLoi2016]成绩比较 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 261 Solved: 165[Submit][Status ...
- BZOJ4559 JLOI2016成绩比较(容斥原理+组合数学+斯特林数)
容斥一发改为计算至少碾压k人的情况数量,这样对于每门课就可以分开考虑再相乘了.剩下的问题是给出某人的排名和分数的值域,求方案数.枚举出现了几种不同的分数,再枚举被给出的人的分数排第几,算一个类似斯特林 ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- 容斥 + 组合数学 ---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 ...
- Gym 100548F Color 给花染色 容斥+组合数学+逆元 铜牌题
Problem F. ColorDescriptionRecently, Mr. Big recieved n flowers from his fans. He wants to recolor th ...
- [CTS2019]随机立方体(容斥+组合数学)
这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪.发现直接做不行,那么,容斥! f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不 ...
随机推荐
- put ListView in a ScrollView(bug fixed)
Android: put ListView in a ScrollView When I need to use ListView with other controls on the same ...
- sqlserver 字符串split
select value from TF_NJVALUES('3C457A2D-188B-4D99-A822-2968054E1FB8,3C457A2D-188B-4D99-A822-2968054E ...
- MVC中导航菜单,选中项的高亮问题。。
先上图: 这个菜单是放在母板页的.比如当前选中的是异常业务监控.如果页面刷新了.就会变成第一张图..选择其他的选项也会,因为页面会刷新嘛.. 怎么处理这个问题了? 答案是记录当 ...
- 【R】array 2 string
paste(1:10, collapse = '') http://stackoverflow.com/questions/2098368/how-do-i-concatenate-a-vector- ...
- jquery把int类型转换成字符串类型的方法
jQuery中把获取的number类型数据转换成字符串类型 var val=$(“#id).val(); If(typeof val==”number”){ val+=' '; }
- Java进阶路线图
第一阶段 技术名称 技术内容 J2SE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相关反编译 ...
- 理解ASP.NET MVC中的ActionResult
通常我们在一个ASP.NET MVC项目中创建一个Controller的时候,Index()方法默认的返回类型都是ActionResult,通过查看UML图,ActionResult实际上是一个抽象类 ...
- listView解决滑动时黑色背景问题
listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...
- easyui------添加中文文件
添加中文文件: 官网地址:http://www.jeasyui.net/download/去jquery-easyui官网下载的文件里面找到easyui-lang-zh_CN.js文件,添加入代码里面 ...
- Extjs学习笔记--(二)
1.配置实用Extjs <link href="Extjs/resources/css/ext-all.css" rel="stylesheet" /&g ...