题目: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]成绩比较——拉格朗日插值的更多相关文章

  1. bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...

  2. BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...

  3. ●BZOJ 4559 [JLoi2016]成绩比较

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 计数dp,拉格朗日插值法.真的是神题啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 ...

  4. ●BZOJ 4559 [JLoi2016]成绩比较(容斥)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 容斥,拉格朗日插值法. 结合网上的另一种方法,以及插值法,可以把本题做到 O( ...

  5. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  6. 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}^ ...

  7. 【BZOJ】2655: calc 动态规划+拉格朗日插值

    [题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...

  8. bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...

  9. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

随机推荐

  1. 进程控制块PCB结构体 task_struct 描述

    进程控制块,英文名(Processing Control Block),简称 PCB . 进程控制块是系统为了管理进程设置的一个专门的数据结构,主要表示进程状态. 每一个进程都对应一个PCB来维护进程 ...

  2. Java I/O 小结

    主要内容: 一.输入流基类:InputStream 和 OutputStream(字节流). Reader 和 Writer(字符流) 二.文件字节流:FileInputStream和FileOutp ...

  3. BufferingForwardingAppender in log4net

    https://blog.csdn.net/szx1999/article/details/50073857 7. 写日志会影响系统性能吗? 写日志必然是会消耗一定资源的,而RollingFileAp ...

  4. space sniffer清理的空间

    部分超级大的单文件,比如数据库 C:\inetpub\logs\LogFiles\W3SVC4 C:\Users\clu\AppData\Local\JetBrains\Transient C:\Us ...

  5. 操作文件和目录【TLCL】

    cp – Copy files and directories mv – Move/rename files and directories mkdir – Create directories rm ...

  6. json数据的拼接与解析

    json数据格式 [{ "firstName": "Brett", "lastName":"McLaughlin", & ...

  7. linux基础(7)-IO重定向

    符合含义 > (重新生成或清空后添加) $ ls -l >test22.log >>(追加) $ ls -l >>test22.log   实例1 $ find . ...

  8. 解析3级JSON的例子

    我们都知道现在Ajax盛行,而且前后台数据交流的格式已经换成了JSON了.虽然我对这种做法还是有点担忧的,如果用户关闭了JavaScript怎么办?但是这些担忧还是不能阻止Ajax的盛行和JSON数据 ...

  9. RPM和yum相关

    写在前面: 在这里可以知道rpm和yum的基本用法,找到更新本地yum源.搭建yum源的方法以及yum很琐碎的东西,包括yum源的优先级.用yum来安装或卸载CentOS图形界面包以及保存yum下载的 ...

  10. linux(centos)安装Maven

    搭建maven 下载jar包,将apache-maven-3.2.2-bin.tar.gz上传到服务器 1.解压 tar -zvxf apache-maven-3.2.2-bin.tar.gz 2.移 ...