题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=4559

题解:

容斥,拉格朗日插值法。
结合网上的另一种方法,以及插值法,可以把本题做到 O(N2)+O(N2+logN),
(本题的 O(N3)以及拉格朗日插值法在本题的用法,本篇目不再赘述。)
定义 f[k]表示至少碾压 k个人的方案数(只考虑分数相对大小关系,不考虑实际分数大小)。

式子的含义是从N-1个人里面选K个人来碾压,然后对于每门科目,
再从没被碾压的人里选一些出来使得B神在本科目的排名为 R。
然后怎样由f[K]得到恰好有K个人被碾压的方案数ANS呢?
套路部分:
容斥系数如下:
f[K]    :1
f[K+1]    :-C(K+1,K) 
f[K+2]    :+C(K+2,K)
......
f[k+j]    :(-1)^(j)*C(k+j,k)
这些东西加起来就得到 ANS了。
容斥系数怎么推出来的呢? 看看这个题目的解法,一样的套路,一样的味道。
求出了 ANS以后,
如果设 Y[i]表示第i门课程且B神排在第R[i]名时的分数分布方案。

最后的答案就是 ANS*Y[1]*Y[2]*Y[3]*...*Y[M]
而这个 Y[i]可以用拉格朗日插值法求出。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 105
#define _ %mod
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
const int mod=1000000007;
int dp[MAXN],U[MAXN],R[MAXN],C[MAXN][MAXN],Y[MAXN],inv[MAXN];
int N,M,K,ANS;
int pow(int a,int b){
int now=1;
while(b){
if(b&1) now=(1ll*now*a)_;
a=(1ll*a*a)_; b>>=1;
}
return now;
}
int Lagrange(int u,int r){
static int lpi[MAXN],rpi[MAXN],p[MAXN],ans,tmp;
lpi[0]=1; rpi[N+2]=1; ans=0;
for(int i=1;i<=N+1;i++){
p[i]=(1ll*p[i-1]+1ll*pow(i,N-r)*pow(u-i,r-1)_)_;
if(i==u) return p[i];
}
for(int i=1;i<=N+1;i++) lpi[i]=1ll*lpi[i-1]*(u-i)_;
for(int i=N+1;i>=1;i--) rpi[i]=1ll*rpi[i+1]*(u-i)_;
for(int i=1;tmp=1,i<=N+1;i++){
tmp=1ll*tmp*lpi[i-1]_*rpi[i+1]_*inv[i-1]_*inv[N+1-i]_*p[i]_;
tmp=(1ll*tmp*((N+1-i)&1?-1:1)+mod)_;
ans=(1ll*ans+tmp)_;
}
return ans;
}
int main()
{
scanf("%d%d%d",&N,&M,&K);
inv[0]=1; inv[1]=1;
for(int i=2;i<=N+1;i++) inv[i]=((-1ll*(mod/i)*inv[mod%i])_+mod)_;
for(int i=1;i<=N+1;i++) inv[i]=1ll*inv[i]*inv[i-1]_;
for(int i=1;i<=M;i++) scanf("%d",&U[i]);
for(int i=1;i<=M;i++) scanf("%d",&R[i]);
for(int i=0;i<=N;i++){
C[i][0]=1;
for(int j=1;j<=i;j++)
C[i][j]=(1ll*C[i-1][j-1]+C[i-1][j])_;
}
for(int i=1;i<=M;i++) Y[i]=Lagrange(U[i],R[i]);
for(int i=N-1;i>=K;i--)
{
dp[i]=C[N-1][i];
for(int j=1;j<=M;j++) dp[i]=1ll*dp[i]*C[N-i-1][N-R[j]-i]_;
ANS=(1ll*ANS+(((i^K)&1)?-1:1)*1ll*dp[i]*C[i][K]_+mod)_;
}
for(int i=1;i<=M;i++) ANS=1ll*ANS*Y[i]_;
printf("%d",(ANS+mod)_);
return 0;
}

●BZOJ 4559 [JLoi2016]成绩比较(容斥)的更多相关文章

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

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

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

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

  3. BZOJ.4558.[JLOI2016]方(计数 容斥)

    BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...

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

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

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

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

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

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

  7. P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值

    LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...

  8. [BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】

    题目链接:BZOJ - 3198 题目分析 题目要求求出有多少对泉有恰好 k 个值相等. 我们用容斥来做. 枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x . 答案就是 ...

  9. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

    题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...

随机推荐

  1. 《Effective Objective-C 2.0》摘要

    前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...

  2. java unicode和字符串间的转换

    package ykxw.web.jyf; /** * Created by jyf on 2017/5/16. */ public class unicode { public static voi ...

  3. idea导入本地maven项目

    首先把项目关闭File->Close Project 否则会将项目导入到当前项目中 回到主界面,点击Import Project 一定要选择项目的pom文件 默认设置,继续往下走 默认配置,下一 ...

  4. 如何打开hprof文件

    最近学习深入java虚拟机的书,照着里面的例子跑了下. 下面是demo: /** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * ...

  5. Qt自定义控件

    Qt创建自定义控件教程 一.新建Qt设计师控件 二.设置项目名称 三.选择kits 这里取消Debug选项,不需要这个选项都是编译为dll文件直接调用. 删除掉MyControl原有的.h和cpp文件 ...

  6. 使用 WTForms 进行表单验证的例子

    #使用 WTForms 进行表单验证的例子 from wtforms import Form from wtforms import BooleanField from wtforms import ...

  7. js字符串操作总结

    字符方法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...

  8. JavaScript中内存使用规则--堆和栈

    堆和栈都是运行时内存中分配的一个数据区,因此也被称为堆区和栈区,但二者存储的数据类型和处理速度不同.堆(heap)用于复杂数据类型(引用类型)分配空间,例如数组对象.object对象:它是运行时动态分 ...

  9. html2canvas 实现dashed虚线边框

    html2canvas是一个将html元素生成canvas的库,绘制的canvas大部分样式和CSS一致.比如截止1.0.0-alpha.12,虚线边框依然绘制为实线,border-collapse依 ...

  10. RPO(Relative Path Overwrite)

    Conception(Relative vs Absolute) Abosolute Path: "/etc/hosts"(in Linux), "C:\Windows\ ...