题目: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. 【HackerRank】Halloween party

    Change language : Alex is attending a Halloween party with his girlfriend Silvia. At the party, Silv ...

  2. perspective 能玩点什么

    今天看又在看张鑫旭的博客,本来是在玩 transform:Matrix() 的,有讲到单个变化的矩阵设置,但多个变化的就不是那么回事了. 不过这都不是事啦,人生嘛,显然总会有些难关不是轻易能过去的,反 ...

  3. Python字符串格式转换

    转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...

  4. Maven配置一键部署远程Tomcat

    1. 首先需要配置远程Tomcat的访问权限(设置访问用户名密码) http://www.cnblogs.com/liuchao102/p/5519345.html 2. 配置pom.xml 添加to ...

  5. matlab学习笔记,图像分块

    clc; clear all; close all; I = imread('E:\matlab\files-images\tomsen512.jpg'); rs = size(I, 1);% 行数c ...

  6. nodejs 中module.exports 和 exports 区别详细介绍

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例 ...

  7. javascript(jquery)_匿名函数

    一.什么是匿名函数 匿名函数:就是没有函数名的函数 二.为什么使用匿名函数 1.最大的用处就是创建闭包 三.匿名函数定义(怎么使用匿名函数) 1.这种方法使用了Function构造函数,把参数列表和函 ...

  8. 使用Blob获取图片并二进制显示实例页面

    HTML代码: <div id="forAppend" class="demo"></div> JS代码: var eleAppend ...

  9. 搜索7--noi1804:小游戏

    搜索7--noi1804:小游戏 一.心得 二.题目 1804:小游戏 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 一天早上,你起床的时候想:“我编程序这 ...

  10. DataGrid的组成论述(WPF)

    DataGrid:它标示是一个整体概念,是个大容器,包含Row的感念 Column:是表格的组成成分(表格是由列组成的),它包括Header和Cell的概念