bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559
关于拉格朗日插值,可以看这些博客:
https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html
https://blog.csdn.net/qq_35649707/article/details/78018944
这个题要先想好DP方程。dp[ i ][ j ]表示第 i 门课、目前有 j 个人被“碾压”。
dp[ i ][ j ]=sigma( dp[ i-1 ][ k ] * C( k , j ) * C( n-k-1 , n-rk[ i ]-j ) * g[ i ] )。其中 g[ i ]=sigma(d=1~u[ i ]) d^(n-rk[ i ]) * ( u[ i ]-d )^(rk[ i ]-1)。
C( k , j )表示从上一次的 k 个人里选 j 个人作为这次还是分数<=自己的人;第二个C就是在已经不被碾压的人中选一些满足自己的排名。
然后每个人的分数是在自己之上还是在自己之下就确定了。枚举自己的分数,在自己之下的人每个有 d 种选择,在自己之上的人每个有 ( u[ ] - d ) 种选择。
g用拉格朗日插值算就行。是一个 n-1 次函数。但不知为何需要 n+1 个点才行。
注意 upd( ) 里写上 & !!!!!
负数的逆元果然可以是它相反数逆元的相反数。
最后是恰好 K 个人,不是大于等于 K 个人。
注意 g 是sigma的,不是单独的 d^( ) * ( )^( ) 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,mod=1e9+;
int n,m,t,u[N],rk[N],dp[N][N],c[N][N],g[N],y[N],inv[N],ans;
void upd(int &x){x>=mod?x-=mod:;x<?x+=mod:;}//////&!!!!!!!
int pw(int x,int k)
{
int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;
}
int calc(int lm,int n,int m)
{
int ret=,d=n+m+;//+2?
if(lm<=d)
{
for(int i=;i<=lm;i++)
ret=(ret+(ll)pw(i,n)*pw(lm-i,m))%mod;
return ret;
}
for(int i=;i<=d;i++)
{
y[i]=(y[i-]+(ll)pw(i,n)*pw(lm-i,m))%mod;//y[i-1]+* !!
int tmp=;
for(int j=;j<=d;j++)
{
if(j==i)continue;
if(i>j)
tmp=(ll)tmp*(lm-j)%mod*inv[i-j]%mod;
else
tmp=(ll)tmp*(j-lm)%mod*inv[j-i]%mod;
}
ret=(ret+(ll)tmp*y[i])%mod;
}
return ret;
}
void init()
{
for(int i=;i<=n;i++)c[i][]=;
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
c[i][j]=c[i-][j]+c[i-][j-],upd(c[i][j]);
for(int i=;i<=n;i++)inv[i]=pw(i,mod-);
for(int i=;i<=m;i++)
g[i]=calc(u[i],n-rk[i],rk[i]-);
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<=m;i++)scanf("%d",&u[i]);
for(int i=;i<=m;i++)scanf("%d",&rk[i]);
init();
dp[][n-]=; int mn0=n-,mn1=n-;
for(int i=;i<=m;i++)
{
mn1=min(mn0,n-rk[i]);
for(int j=t;j<=mn1;j++)//t
{
for(int k=j;k<=mn0;k++)
if(dp[i-][k])
dp[i][j]=(dp[i][j]+(ll)dp[i-][k]*c[k][j]%mod*c[n--k][n-rk[i]-j]%mod*g[i])%mod;
}
mn0=mn1;
}
printf("%d\n",dp[m][t]);
return ;
}
bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值的更多相关文章
- 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]成绩比较(容斥)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 容斥,拉格朗日插值法. 结合网上的另一种方法,以及插值法,可以把本题做到 O( ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- BZOJ.3453.tyvj 1858 XLkxc(拉格朗日插值)
BZOJ 题意即求\[\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{x=1}^jx^k\] 我们知道最后一个\(\sum\)是自然数幂和,设\(f(n)=\sum_{x=1}^ ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法
4559: [JLoi2016]成绩比较 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 261 Solved: 165[Submit][Status ...
随机推荐
- Raspberry Pi开发之旅-WIFI遥控小车
一.简单介绍树莓派的GPIO口 上图是树莓派2代的接口(不同型号接口会有差异),我们就以此为例来说下这些接口. 1.GPIO介绍 GPIO 英文全称是:General-purpose input/ou ...
- Android开发BUG及解决方法2
错误描述: 错误分析: 程序依赖的两个包冲突 解决方法: 在build.gradle文件中android节点下加packagingOptions节点
- 虚构 css 父级选择器
能 CSS 解决的绝不用 JS,这句话又一次故作装逼地说出来还是挺爽的... 比如下拉列表,能用 CSS 的 :focus 就不用 JS 的 .on("focus blur") 能 ...
- git 使用教程 --基础一
第一步:下载git https://git-scm.com/ 第二步: 切到需要保存的文件夹下,执行: bogon:VBV mona$ git init #初始化,表示即将对当前文件夹进行版本控制 ...
- systemverilog新增的always_comb,always_ff,和always_latch语句
在Verilog中,设计组合逻辑和时序逻辑时,都要用到always: always @(*) //组合逻辑 if(a > b) out = 1; else out = 0; always @(p ...
- collectionView的案例
#import "ViewController.h" #import "CollectionViewCell.h" @interface ViewControl ...
- Eclipse SVN插件设置
项目开发中,开发人员用SVN来管理代码,在和服务器同步时,需要避免上传不必要的一些编译文件,如.class,.log,target等文件,这里需要设置同步选项. 打开Eclipse ---> W ...
- PHP开发框架
利用PHP开发框架可以帮助你编写干净和可重用的代码.PHP开发框架遵循MVC设计模式,以确保能够明确区分逻辑和演示文稿.但是有关PHP框架的争论也不少,这是因为有的人喜欢性能,有的人喜欢文档,而有的人 ...
- uvalive 6932
三个串必须要一起dp 之前刚学了dfs的记忆化搜索的dp方式 觉得很舒服 现学现卖然后两个小时都没有做出来 优化1:之前在dfs中 对每一个pos都会枚举所有可能的组合 结合当前状态来产生新的状态 来 ...
- Spring初学之bean之间的关系和bean的作用域
一.bean之间的关系 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...