【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个三维坐标均不 ...
随机推荐
- 防止短连接耗尽你的动态TCP端口
详见TCP协议https://en.wikipedia.org/wiki/Transmission_Control_Protocol但是TIME_WAIT是有时间窗口的,Linux默认是60秒.所以如 ...
- jQuery实现布局高宽自适应
在页面布局(layout)时经常是上左右的框架布局并且需要宽.高度的自适应,div+css是无法实现(*hegz:div+css其实是可以实现的,利用jQuery比较容易实现浏览器的兼容性),所以需要 ...
- 【转】Mac下升级python2.7到python3.6
1. 前言 Mac系统自带python2.7,本文目的是将自带的python升级到3.6版本. 网上有本多的做法是让python2.7和python3.X两个版本共存,博主并不知道,是两版本共存好,还 ...
- C++ 判断目录是否存在并新建目录
http://blog.csdn.net/u012005313/article/details/50688257 #include <io.h> #include <string&g ...
- 机器学习理论之SVM
支持向量机系列 (1) 算法理论理解 http://blog.pluskid.org/?page_id=683 手把手教你实现SVM算法(一) (2) 算法应用 算法应用----python 实现实例 ...
- 【Java面试题】39 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
1.什么是Set?(what) Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象. 2.如何来区分重复与否呢?(how) “ 用 iterator() ...
- centos6.5 开发环境部署(nignx1.7.10+php5.4.38+mysql+ftp)
一些命令和规则以及准备 本次流程再 DigitalOcean上的vps上通过 查看是否已经安装 rpm -qa | grep nginx 删除安装 #普通删除模式 rpm -e nginx #强力删除 ...
- UVA 1203 - Argus(优先队列)
UVA 1203 - Argus 题目链接 题意:给定一些注冊命令.表示每隔时间t,运行一次编号num的指令.注冊命令结束后.给定k.输出前k个运行顺序 思路:用优先队列去搞,任务时间作为优先级.每次 ...
- Python 常见文件操作的函数示例(转)
转自:http://www.cnblogs.com/txw1958/archive/2012/03/08/2385540.html # -*-coding:utf8 -*- ''''' Python常 ...
- raw_input()
raw_input() 用于接收标准输入,并把标准输入当成字符串类型来处理,只能在 Python2 中使用,Python3 中没有这个函数 #!/usr/bin/env python #-*- cod ...