BZOJ4559 成绩比较
题目传送门
分析:
我们可以先试着求一下,对于单个学科,有多少种分配方案可以使B神排名为R
对于第i个学科
\(~~~~g(i)=\sum_{j=1}^{H_i}j^{n-R_i}(H_i-j)^{R_i-1}\)
相当于枚举B神本人的分数,然后分别将其他人分配
这个\(H_i\)很大,但是这个函数是一个大约在n次的多项式,拉格朗日插值一下就好了
不会?去百度一下,就是套一个公式2333
然后我们考虑DP
设f[i][j]表示前i个技能后目前碾压了j个人
那么
\(~~~~f[i][j]=\sum_{k=j}^{n-1}f[i-1][k]C_k^jC_{n-k-1}^{R_i-1-k+j}g(i)\)
相当于是在前i-1个技能中碾压的k个人里面选择j个,剩下的n-k-1再选R[i]-1-k+j,一共j个人被碾压
然后大力DP
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define maxn 105
#define MOD 1000000007
using namespace std;
inline int getint()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
int n,m;
long long H[maxn],R[maxn];
long long f[maxn][maxn],g[maxn];
long long C[maxn][maxn];
inline long long ksm(long long num,long long k)
{
long long ret=1;
for(;k;k>>=1,num=num*num%MOD)if(k&1)ret=ret*num%MOD;
return ret;
}
inline long long lagrange(int x)
{
long long ret=0;
long long tmp[maxn];memset(tmp,0,sizeof tmp);
for(int h=0;h<maxn;h++)for(int i=1;i<=h;i++)
(tmp[h]+=ksm(i,n-R[x])*ksm(h-i,R[x]-1))%=MOD;
for(int i=0;i<maxn;i++)
{
long long num=1;
for(int j=0;j<maxn;j++)if(i!=j)num=num*(H[x]-j)%MOD*ksm((i-j+MOD)%MOD,MOD-2)%MOD;
(ret+=tmp[i]*num)%=MOD;
}
return (ret+MOD)%MOD;
}
int main()
{
n=getint(),m=getint();int p=getint();
for(int i=1;i<=m;i++)H[i]=getint();
for(int i=1;i<=m;i++)R[i]=getint();
for(int i=1;i<=m;i++)g[i]=lagrange(i);
for(int i=0;i<maxn;i++)
{
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;
}
f[0][n-1]=1;
for(int i=1;i<=m;i++)for(int j=0;j<n;j++)for(int k=j;k<n;k++)
if(R[i]-1-k+j>=0&&n-1-k>=R[i]-1-k+j)
(f[i][j]+=f[i-1][k]*C[k][j]%MOD*C[n-k-1][R[i]-1-(k-j)]%MOD*g[i])%=MOD;
printf("%lld\n",f[m][p]);
}
BZOJ4559 成绩比较的更多相关文章
- 【BZOJ4559】成绩比较(动态规划,拉格朗日插值)
[BZOJ4559]成绩比较(动态规划,拉格朗日插值) 题面 BZOJ 洛谷 题解 显然可以每门课顺次考虑, 设\(f[i][j]\)表示前\(i\)门课程\(zsy\)恰好碾压了\(j\)个\(yy ...
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
- 【bzoj4559】成绩比较
Portal -->bzoj4559 补档计划 借这题补个档--拉格朗日插值 插值的话大概就是有一个\(n-1\)次多项式\(A(x)\),你只知道它在\(n\)处的点值,分别是\ ...
- 【BZOJ4559】成绩比较(组合计数,容斥原理)
题意: G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门 ...
- bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法
4559: [JLoi2016]成绩比较 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 261 Solved: 165[Submit][Status ...
- BZOJ4559: [JLoi2016]成绩比较(dp 拉格朗日插值)
题意 题目链接 Sol 想不到想不到.. 首先在不考虑每个人的真是成绩的情况下,设\(f[i][j]\)表示考虑了前\(i\)个人,有\(j\)个人被碾压的方案数 转移方程:\[f[i][j] = \ ...
- BZOJ4559 JLOI2016成绩比较(容斥原理+组合数学+斯特林数)
容斥一发改为计算至少碾压k人的情况数量,这样对于每门课就可以分开考虑再相乘了.剩下的问题是给出某人的排名和分数的值域,求方案数.枚举出现了几种不同的分数,再枚举被给出的人的分数排第几,算一个类似斯特林 ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)
bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...
随机推荐
- dotnet 非泛型 类型 System.Collections.IEnumerable 不能与类型实参一起使用
如果在开发的时候遇到非泛型 类型"IEnumerable"不能与类型参数一起使用,那么就是变量的命名空间没弄对 在 dotnet 里面有 System.Collections.IE ...
- CSS 手札记
Display:Block/Flex 宽度如果不定义会尽可能的扩充外层宽度 在内容区域使用高度百分比和固定像素高度的时候外层设overflow:auto;可以把内层的高度撑开,否则外层会比内层短一截 ...
- BIO、NIO、AIO 个人总结
BIO(blocking io) BIO即为阻塞IO,在网络编程中,它会在建立连接和等待连接的对端准备数据阶段进行阻塞.因此为了支撑高并发的用户访问,一般会为每一个socket 连接分配一个线程.但使 ...
- 精通CSS:高级WEB解决方案
选择器:高级选择器:属性选择器:[] ,例如:a[href=”#”] {};选择器的优先级:!important为最高优先级,其次优先级次序规则:a,b,c,d ,a代表行内样式,b代表ID选择器,c ...
- web应用中web.xml文件的解释
一.web.xml配置文件常用元素及其意义预览 1 <web-app> 2 3 <!--定义了WEB应用的名字--> 4 <display-name></di ...
- HDU4528 小明捉迷藏 [搜索-BFS]
一.题意 小明S在迷宫n*m中找大明D和二明E,障碍物X不能走,问你计算是否能在时间t内找到大明和二明 二.分析 2.1与普通的BFS不同,这里可以走回头路,这里应该建立四维的标记数组标记数组,例如v ...
- JAVA8之 Stream 流(四)
如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- 在Mac/linux上查找(并终止)进程锁定特定端口的几种方法
前言 无论是做网站还是做产品,经常使用到杀死某个进程的方法.制作脚本并熟悉运用是一个非常节省时间的方法. 基本命令 查找: [sudo] lsof -i :3000 杀戮 kill -9 方法一 ...
- 【转】C#中base关键字的几种用法:base()
转:https://blog.csdn.net/cplvfx/article/details/82982862 base其实最大的使用地方在面相对象开发的多态性上,base可以完成创建派生类实例时调用 ...