BZOJ

洛谷

为什么已经9点了...我写了多久...

求方案数,考虑DP...

\(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数。

那么$$f[i][j]=\sum_{k=j}^{n-1}f[i-1][k]\times C_k^{k-j}\times C_{n-1-k}^{R_i-1-(k-j)}\times g[i]$$

就是先从\(k\)人中选出\(k-j\)在\(i\)这门课比B神得分高,然后再从剩下\(n-1-k\)个人中选\(R_i-1-(k-j)\)个比B神得分高的。

对于排名限制,\(g[i]\)表示对\(i\)这门课分配得分使得有\(R_i-1\)个人得分比B神高的方案数。直接枚举一下B神得分:$$g[i]=\sum_{j=1}{U_i}j{n-R_i}(U_i-j)^{R_i-1}$$

不难看出这是一个关于\(U_i\)的\(n\)次的多项式。拉格朗日插值算一下就好了。

(不对为啥是\(n\)次的不是\(n-1\)次的啊QAQ求路过dalao解答QAQ)(因为多一个\(\sum\)?)

复杂度\(O(n^3\log n)\)。

因为求\(g\)在某点的值的时候要\(n\)次快速幂。。看了半天题解也没看懂怎么优化掉这个。但是有更好的做法:here or here,是\(n^3\)的。

不管了反正这个\(\log\)也不大。

用容斥做也可以,瓶颈也是在于求\(g\)。。

//912kb	592ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define mod 1000000007
#define Mod(x) x>=mod&&(x-=mod)
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
typedef long long LL;
const int N=105; int ifac[N],y[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
}
int Lagrange(int *y,const int n,const int x)
{
static int pre[N],suf[N];
pre[0]=x, suf[n+1]=1;
for(int i=n; i; --i) suf[i]=1ll*suf[i+1]*(x+mod-i)%mod;
for(int i=1; i<n; ++i) pre[i]=1ll*pre[i-1]*(x+mod-i)%mod;
LL ans=0;
for(int i=0,up,down; i<=n; ++i)
{
if(i) up=1ll*pre[i-1]*suf[i+1]%mod*y[i]%mod;
else up=1ll*suf[i+1]*y[i]%mod;
down=(n-i)&1?mod-1ll*ifac[i]*ifac[n-i]%mod:1ll*ifac[i]*ifac[n-i]%mod;
ans+=1ll*up*down%mod;
}
return ans%mod;
} int main()
{
static int C[N][N],f[N][N],U[N],R[N]; int n=read(),m=read(),K=read(),fac=1;
for(int i=2; i<=n; ++i) fac=1ll*fac*i%mod;
ifac[n]=FP(fac,mod-2);
for(int i=n; i; --i) ifac[i-1]=1ll*ifac[i]*i%mod;
C[0][0]=1;//!
for(int i=1; i<=n; ++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(C[i][j]);
}
for(int i=1; i<=m; ++i) U[i]=read();
for(int i=1; i<=m; ++i) R[i]=read(); f[0][n-1]=1;
for(int i=1; i<=m; ++i)
{
int Ri=R[i];
for(int x=1; x<=n; ++x)
{
LL tmp=0;
for(int j=1; j<=x; ++j) tmp+=1ll*FP(j,n-Ri)*FP(x-j,Ri-1)%mod;//这里j要枚举到x,因为0^0=1!...
y[x]=tmp%mod;
}
int g=Lagrange(y,n,U[i]);
for(int j=K; Ri+j<=n; ++j)
{
LL tmp=0;
for(int k=j; k<n; ++k)
if(k-j<Ri) tmp+=1ll*f[i-1][k]*C[k][j]%mod*C[n-1-k][Ri-1-k+j]%mod;
else break;
f[i][j]=tmp%mod*g%mod;
}
}
printf("%d\n",f[m][K]); return 0;
}

BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)的更多相关文章

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

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

  2. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

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

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

  4. 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学

    [BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...

  5. bzoj 4455 [Zjoi2016]小星星 树形dp&容斥

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 643  Solved: 391[Submit][Status] ...

  6. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...

  9. 洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)

    题面传送门 考虑容斥.我们记 \(a_i\) 为钦定 \(i\) 个人被 B 神碾压的方案数,如果我们已经求出了 \(a_i\) 那么一遍二项式反演即可求出答案,即 \(ans=\sum\limits ...

随机推荐

  1. 学习Maven POM

    什么是POM POM stands for "Project Object Model".It is an XML representation of a Maven projec ...

  2. mybatis 遍历map;

    mybatis 遍历map; 参考http://blog.csdn.net/hj7jay/article/details/78652050 ps: ${m[key]}这是显示 打印的key读value ...

  3. sqlserver text类型字段错误 net.sourceforge.jtds.jdbc.ClobImpl@66fa192的解决方法

    1. SqlServer数据库中text/ntext字段,在用jtds1.2驱动时,会出现用getString()取不到值的问题,toString()也不行. 昨天查了下帮助可以通过简单的配置解决.即 ...

  4. 使用python调用wps v9转换office文件到pdf

    #!/usr/bin/python2.6 # -*- coding: utf-8 -*- # pip install timeout-decorator import os import win32c ...

  5. LibreOJ β Round #2

    题解: 都是不错的技巧题目 t1暴力就不说了 t2dp是比较显然的 然后发现都是0,1用bitset优化 代码非常短 t3容易发现这个东西在不断合并 于是我们想到启发式合并 存疑:splay启发式合并 ...

  6. xcode svn commit is not under version control 和 git常用指令

    使用Xcode提交一个第三方库时,由于包含资源文件,总是提交不了,提示报错:XXX commit is not under version control (1) 网上查了下,得知 xcode对于sv ...

  7. Ant之build.xml详解

    Ant之build.xml详解 关键字: ant build.xml Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译 ...

  8. ionic2中使用自定义图标

    在ionic2中使用自定义图标,如iconfont(阿里巴巴矢量图标). 先在http://www.iconfont.cn/ 中找到自己需要的图标,然后将图标加入购物车,然后下载该图标. 下载完成后解 ...

  9. net core体系-3再次认识net core

    1 什么是ASP.NET Core ASP.NET Core 是一个全新的开源.跨平台框架,可以用它来构建基于网络连接的现代云应用程序,比如:Web 应用,IoT(Internet Of Things ...

  10. 请使用千位分隔符(逗号)表示web网页中的大数字

    方法一:使用正则表达式 语法如下: String(Number).replace(/(\d)(?=(\d{3})+$)/g, "$1,"); 举例: String(12345678 ...