【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
【题意】n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui]。B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数。当有一位同学的一门必修课分数不同时视为两种情况不同。n,m<=100,Ui<=10^9。
【算法】计数DP+排列组合+拉格朗日插值
【题解】把分数作为状态不现实,只能逐门课考虑。
设$f[i][j]$表示前i门课,有j个同学被碾压的情况数,则有:
$$f[i][j]=g(i)\cdot\sum_{k=j}^{n}f[i-1][k]\cdot\binom{k}{k-j}\cdot\binom{n-k-1}{r_i-1-k+j}$$
解释:首先可以发现当天分数需要高于B神的人数是确定的,和多少人被碾压等信息无关,所以令g(i)表示第i门课的合法分数情况数,独立计算。
枚举前i-1门课被碾压的人数k,那么ri-1由两部分组成,一部分是不再被碾压的k-j人(从k人中选出),剩余的ri-1-k+j人从原本就未被碾压的n-k-1人中选出。
考虑计算g(i),枚举B神的分数i,则有r-1人的选择范围是[i+1,Ui],另外n-r人的选择范围是[1,i],即:
$$g(i)=\sum_{i=1}^{U_i}(U_i-i)^{r_i-1}*i^{n-r}$$
Ui太大了,考虑将Ui当成自变量后用拉格朗日插值解决,即:
$$f(x)=\sum_{i=1}^{x}(x-i)^{r-1}*i^{n-r}$$
现在我们要求f(Ui)的值,需要确定多项式的次数。网上的解释都看不懂,强行理解:令i=x/2,那么式子右边的i也可以表示为(n-i),合并后次数为n-1,再加上Σ的上届为x,那么最高次就是n,这是一个n次多项式。
于是我们可以对每个i,O(n^2)枚举前n+1个点的值来插值得到f(Ui)。DP转移的复杂度也是O(n)的。
总复杂度O(n^3)。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,MOD=1e9+;
int v[maxn],n,m,kind,u[maxn],r[maxn],g[maxn],f[maxn][maxn],c[maxn][maxn];
int power(int x,int k){int ans=;while(k){if(k&)ans=1ll*ans*x%MOD;x=1ll*x*x%MOD;k>>=;}return ans;}
int inv(int x){return power(x,MOD-);}
int M(int x){return x>=MOD?x-MOD:x;}
int solve(int u,int r){
for(int x=;x<=n+;x++){
g[x]=;//!
for(int i=;i<=x;i++){
g[x]=M(g[x]+1ll*power(x-i,r-)*power(i,n-r)%MOD);
}
if(x==u)return g[x];
}
for(int i=;i<=n+;i++){
v[i]=;
for(int j=;j<=n+;j++)if(i!=j)v[i]=1ll*v[i]*(i-j+MOD)%MOD;
v[i]=inv(v[i]);
}
int ans=;
for(int i=;i<=n+;i++){
int w=1ll*g[i]*v[i]%MOD;
for(int j=;j<=n+;j++)if(i!=j)w=1ll*w*(u-j+MOD)%MOD;//i!=j
ans=M(ans+w);
}
return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&kind);
for(int i=;i<=n;i++){
c[i][]=;
for(int j=;j<=i;j++){
c[i][j]=M(c[i-][j-]+c[i-][j]);
}
}
for(int i=;i<=m;i++)scanf("%d",&u[i]);
for(int i=;i<=m;i++)scanf("%d",&r[i]);
f[][n-]=;
for(int i=;i<=m;i++){
int g=solve(u[i],r[i]);
for(int j=kind;j<=n;j++){
for(int k=j;k<=n;k++)if(r[i]--k+j>=&&r[i]--k+j<=n-k-){
f[i][j]=M(f[i][j]+1ll*f[i-][k]*c[k][k-j]%MOD*c[n-k-][r[i]--k+j]%MOD);
}
f[i][j]=1ll*f[i][j]*g%MOD;
}
}
printf("%d",f[m][kind]);
return ;
}
【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值的更多相关文章
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...
- BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)
BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...
- ●BZOJ 4559 [JLoi2016]成绩比较
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 计数dp,拉格朗日插值法.真的是神题啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 ...
- bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...
- P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值
LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...
- ●BZOJ 4559 [JLoi2016]成绩比较(容斥)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 容斥,拉格朗日插值法. 结合网上的另一种方法,以及插值法,可以把本题做到 O( ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...
随机推荐
- 使用FileReader对象的readAsDataURL方法来读取图像文件
使用FileReader对象的readAsDataURL方法来读取图像文件 FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项 ...
- 面试问题总结二(技术能力-PHP)----Ⅳ
57.Linux 的基本命令(重点,现在多数服务器都是Linux 系统) 答:arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmid ...
- vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法
1. 自己的vSphere 连接vCenter 向管理虚拟机 结果发现总是有异常. 提示如图示 VMRC控制台的连接已经断开 2. 花了比较长的时间也没搞定. 后来百度发现 关闭一个进程 然后重新登录 ...
- ES6 学习1
https://www.jianshu.com/p/287e0bb867ae 1,let表示变量.const表示常量.let和const都是块级作用域.一个在函数内部,一个在代码块内部: const ...
- 卸载Visual Studio最佳方法难道真的是重装系统?
卸载Visual Studio最佳方法难道真的是重装系统? 卸载Visual Studio最佳方法难道真的是重装系统? 使用TotalUninstaller貌似也没有效果,默认卸载的,程序列表里面还是 ...
- HDU4240_Route Redundancy
题目很简单.给一个有向图,求两点间的最大流量与任意一条路中的最大流量的比值. 最大流不说了,求出单条流量最大的路径可以用类似Spfa的方法来搞,保存到达当前点的最大流量,一直往下更新即可. 召唤代码君 ...
- double 和 im2double 的区别
double 就是简单地把一个变量类型转换成double型,数值大小不变. 函数im2double将输入换成double类型.如果输入是unit8,unit16或者是二值的logical类型,则函数i ...
- 微信小程序与java后台交互
java后台使用的ssm框架,小程序连接的本地接口.跟正常的web访问没什么区别,也是后台获取url,返回json数据:只是小程序前台请求的url要带上http://localhost:80801. ...
- 数据结构开发(14):KMP 子串查找算法
0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...
- 知乎回答:每日完成任务用于打卡的APP
其实我也一直在寻找最佳的解决方案.安卓上有这样的,叫做HabitHub.用过一段时间,不容易坚持,这个软件对于培养习惯来说无疑是最好的,但是仅限于记录,这样的软件实在太多.我这里提供一下我自己的方法, ...