【LuoguP3270】[JLOI2016] 成绩比较

题目链接

题目描述

G系共有n位同学,M门必修课。这N位同学的编号为0到N-1的整数,其中B神的编号为0号。这M门必修课编号为0到M-1的整数。一位同学在必修课上可以获得的分数是1到Ui中的一个整数。

如果在每门课上A获得的成绩均小于等于B获得的成绩,则称A被B碾压。在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没有被他碾压。D神查到了B神每门必修课的排名。

这里的排名是指:如果B神某门课的排名为R,则表示有且仅有R-1位同学这门课的分数大于B神的分数,有且仅有N-R位同学这门课的分数小于等于B神(不包括他自己)。

我们需要求出全系所有同学每门必修课得分的情况数,使其既能满足B神的说法,也能符合D神查到的排名。这里两种情况不同当且仅当有任意一位同学在任意一门课上获得的分数不同。

你不需要像D神那么厉害,你只需要计算出情况数模10^9+7的余数就可以了。

Sol

量比较多,且初步看上去合并很困难,那么我们就必然从容斥的角度入手来简化问题了。

首先我们注意到有一个恰好有 K 个人被 B 君完虐的条件,这个条件使得学科之间有了联系,因为我们必须保证某些成绩低于 B 君的分数都落在某一个人身上,而我们如果仅仅只需考虑一门学科的话是很好算的。所以我们把这个条件容斥掉,那么就二项式反演列出初步的式子:
\[\sum_{i=k}^{n-1} (-1)^{i-k}{i\choose k}{n-1\choose i}\prod_{j=1}^m F[i][j]\]

先枚举总共至少上有多少个人被B君完虐,前面的一个组合数就是二项式反演的容斥系数,后面的组合数则是在除B君外的 \(n-1\) 个人里挑出 \(i\) 个被完虐。之后各个学科之间就互不影响了,方案数直接乘起来。
那么后面的方案数 \(F[i][j]\) 是什么呢,就是对于一门学科 \(j\) 而言,现在强制有了至少 \(i\) 个人被完虐,使得排名合法的方案数。
这个的式子是比较轻松就可以列出的。
\[F[i][j]=\sum_{x=1}^{U_j} x^{n-R[j]}*(U[j]-x)^{R[j]-1}*{n-1-i\choose R[j]-1}\]

直接枚举 B 君这一门的分数 ,我们可以确定有多少个人的分数小于等于他和大于他,并且枚举了分数之后这些人的分数范围也出来了。后面乘上一个组合数是因为除了强制的被完虐的人已经给 B 君垫着以外,为了保证B君在这一们学科上的排名,我们还需要额外选出一些人给他垫着。

发现这样子其实中间一大坨东西都和 i 没有关系,我们直接把中间的处理出来就可以了,那么就看怎么算中间的这个东西了:

\[\sum_{x=1}^{U_j} x^{n-R[j]}*(U[j]-x)^{R[j]-1}\]

直接暴力二项式定理展开然后交换求和顺序就好了,最后的式子长这样:

\[\sum_{t=0}^{R[j]-1}(-1)^t{R[j]-1\choose t}U+j^{R[j]-1-t}*\sum_{x=1}^{U_j}x^{n-R[j]+t}\]

后面那玩意就是自然指数幂了,随便用一种方法就行了。(所以我现在做的拉格朗日插值的题目怎么都是求自然指数幂以及他们的前缀和啊)

code:

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void init(T&x){
    x=0;char ch=getchar();bool t=0;
    for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
    if(t) x=-x;return;
}
typedef long long ll;
int n,m,k;
const int N=112;
const int mod=1e9+7;
int U[N],R[N],fac[N],finv[N];
const int inv2=500000004;
template<class T>inline void Inc(T&x,int y){x+=y;if(x>=mod) x-=mod;}
template<class T>inline void Dec(T&x,int y){x-=y;if(x < 0 ) x+=mod;}
template<class T>inline int fpow(int x,T k){int ret=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) ret=(ll)ret*x%mod;return ret;}
inline int Sum(int x,int y){x+=y;return x>=mod? (x-mod):x;}
inline int Dif(int x,int y){x-=y;return x < 0 ? (x+mod):x;}
inline int C(int n,int m){return n<m? 0:((ll)fac[n]*finv[m]%mod*finv[n-m]%mod);}
int F[N],S[N];
inline void Prework(){
    int m=110;
    fac[0]=finv[0]=1;
    for(register int i=1;i<=m;++i) fac[i]=1ll*fac[i-1]*i%mod;
    finv[m]=fpow(fac[m],mod-2);
    for(register int i=m-1;i;--i) finv[i]=1ll*finv[i+1]*(i+1)%mod;
    return;
}
int Y[N];
inline int Lagerange(int K,int n){
    int LIM=K+2;int S=1;
    for(int i=1;i<=LIM;++i) {S=(ll)S*Dif(n,i)%mod;Y[i]=Sum(Y[i-1],fpow(i,K));}
    if(n<=LIM) return Y[n];
    int ans=0;
    for(int i=1;i<=LIM;++i) {
        int ret=(ll)S*fpow(Dif(n,i),mod-2)%mod*finv[i-1]%mod*finv[LIM-i]%mod;
        if((LIM-i)&1) ret=mod-ret;
        Inc(ans,(ll)Y[i]*ret%mod);
    }
    return ans;
}
int main()
{
    init(n),init(m),init(k);
    int Mx=0;Prework();
    for(register int i=1;i<=m;++i) init(U[i]);
    for(register int i=1;i<=m;++i) init(R[i]),Mx=max(Mx,R[i]);
    --Mx;int ans=0;
    for(int i=1;i<=m;++i) {
        F[i]=0;
        int inv=fpow(U[i],mod-2);
        int G=fpow(U[i],R[i]);
        for(int t=0;t<R[i];++t){
            G=(ll)G*inv%mod;
            int ret=(ll)C(R[i]-1,t)*G%mod*Lagerange(n-R[i]+t,U[i])%mod;
            (t&1)? Dec(F[i],ret):Inc(F[i],ret);
        }
    }
    for(int i=k;i<=n;++i) {
        if(n-1-i<Mx) break;
        int ret=(ll)C(i,k)*C(n-1,i)%mod;
        int base=1;
        for(int j=1;j<=m;++j) base=(ll)base*C(n-1-i,R[j]-1)%mod*F[j]%mod;
        ((i-k)&1)? Dec(ans,(ll)ret*base%mod):Inc(ans,(ll)ret*base%mod);
    }
    cout<<Sum(ans,mod)%mod<<endl;
}

原文地址:https://www.cnblogs.com/NeosKnight/p/10539347.html

时间: 2024-10-11 00:02:31

【LuoguP3270】[JLOI2016] 成绩比较的相关文章

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

[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门课上A获得的成绩均小于等于B获得的成绩,则称A被B碾压.在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没有被他碾压.D神查到了B神每门必修课的排名.这里的排名是指:如果B神某门课的排名为R,则表示有且

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

4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status][Discuss] Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门课上A获得的成绩均小于等于B获 得的成绩,则称A被B碾压.在B

bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较

http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名的分数安排方案数 g[i]的求法: 枚举B神这门课x分,则有n-Ri个人的分数<=x ,Ri-1个人的分数>x Ui 上限是1e9,但是g[i] 是一个关于Ui 的n次多项式,所以可以用拉格朗日插值法来求 递推 f[i][j]: 假设f[i-1][w] 转移到了f[i][j],j>=w 前i

bzoj4559 [JLOI2016]成绩比较 拉格朗日插值

题目描述 G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数. 如果在每门课上A获得的成绩均小于等于B获得的成绩,则称A被B碾压.在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没有被他碾压.D神查到了B神每门必修课的排名. 这里的排名是指:如果B神某门课的排名为R,则表示有且仅有R-1位同学这门课的分数大于B神的分数,有且仅有N-R位

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

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html https://blog.csdn.net/lvzelong2014/article/details/79159346 https://blog.csdn.net/qq_35649707/article/details/78018944 还只会最简单的

[JLOI2016] 成绩比较

推石子 首先设\(d[i]=\sum_{t=1}^{U[i]}t^{n-R[i]}(U[i]-t)^{R[i]-1}\),即第\(i\)门课程分数的合法分布方案数: 然后设\(f[i,j]\)表示前\(i\)门课程中\(j\)个人被碾压的合法方案数,转移有: \[ \begin{aligned} &f[i,j]=d[i]\times\sum_{k=1}^n\pmatrix{k\\k-j}\pmatrix{n-k-1\\(R[i]-1)-(k-j)}f[i-1,k] &f[0,n-1]=1

bzoj4559: [JLoi2016]成绩比较

感谢丁爷爷教我做这个题的后半部分. 首先,运用一发容斥原理,求出所有人与B神每门课分数相对关系的不同方案数. 这个似乎大(wo)家(lan)都(de)会(hui)了(yi),我就不说了,详见代码里的f. 然后,我们就需要计算每门课每个人的分数的方案数.对于每一门课,我们分别计算,然后把它们乘起来. 方便起见,令总分为s,名次为rk. 设B神的分数为x,则方案数为x^(n-rk)*(s-x)^(rk-1) 展开得到c(rk-1,0)*s^(rk-1)*x^(n-rk)-c(rk-1,1)*s^(r

●BZOJ 4559 [JLoi2016]成绩比较

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 计数dp,拉格朗日插值法.真的是神题啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊. 先来看看 dp定义:(由于每门课程的分数分布方案是独立的,所以先不管每科实际分数大小所贡献的方案数.)dp[i][j]:表示前 i门课程,只考虑分数相对大小关系时,B神碾压了 j个人的方法数也就是说上面的dp定义只是表示一个相对关系的方案数(即不考虑实际分数大小). 那么d

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

[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一位同学的一门必修课分数不同时视为两种情况不同.n,m<=100,Ui<=10^9. [算法]计数DP+排列组合+拉格朗日插值 [题解]把分数作为状态不现实,只能逐门课考虑. 设$f[i][j]$表示前i门课,有j个同学被碾压的情况数,则有: $$f[i][j]=g(i)\cdot\sum_{k=j