首页 > 其他分享 >【题解】洛谷-P3270 [JLOI2016]成绩比较

【题解】洛谷-P3270 [JLOI2016]成绩比较

时间:2023-01-30 08:33:15浏览次数:39  
标签:JLOI2016 洛谷 dbinom int 题解 sum times res 105

式子有点长,步骤有点多,所以写一下。

题目要求恰好 \(k\) 人被吊打的方案数,容易想到二项式反演,设 \(f(k)\) 为钦定 \(k\) 人其他任意的方案数,\(g(k)\) 为恰好 \(k\) 人的方案数。基本式子:

\[f(k)=\sum_{i=k}^{n-1} \dbinom{i}{k} g(i)\Leftrightarrow g(k)\sum_{i=k}^{n-1} \dbinom{i}{k} (-1)^{i-k} f(i) \]

现在要求 \(f(k)\)。

从内层向外看,若在学科 \(i\) 得了 \(j\) 分,则有 \(n-R_i\) 人取值在 \([1,j]\) 间任意,\(R_i-1\) 人取值在 \([j+1,U_i]\) 间任意。这 \(n-R_i\) 人包括起初钦定的 \(k\) 人,剩下的部分不要求多个学科中相同。

于是对于学科 \(i\),可以得出一个:

\[\begin{aligned} &\dbinom{n-1-k}{n-R_i-k}\sum_{j=1}^{U_i} j^{n-R_i}\times (U_i-j)^{R_i-1}\\ =&\dbinom{n-1-k}{n-R_i-k}\sum_{j=1}^{U_i} j^{n-R_i}\times \sum_{l=0}^{R_i-1} \dbinom{R_i-1}{l} U_i^l\times (-1)^{R_i-1-l} \times j^{R_i-1-l}\\ =&\dbinom{n-1-k}{n-R_i-k}\sum_{l=0}^{R_i-1}\dbinom{R_i-1}{l} (-1)^{R_i-1-l} U_i^l\times\sum_{j=1}^{U_i} j^{n-1-l}\\ =&\dbinom{n-1-k}{n-R_i-k}h(i) \end{aligned}\]

后面与 \(k\) 无关就写作 \(h(i)\) 了,最后的自然数幂和可以 \(O(n)\) 求,于是求单个 \(h(i)\) 是 \(O(n^2)\) 的,所有 \(h(i)\) 是 \(O(n^2m)\) 的。

接下来只需要枚举钦定 \(k\) 人的方案以及将相互独立的每个学科之前方案数相乘:

\[f(k)=\dbinom{n-1}{k}\prod_{i=1}^m\dbinom{n-1-k}{n-R_i-k} h(i) \]

最后套上二项式反演,即可求出 \(g(k)\)。

点击查看代码
int n,m,k;
int lim[105],rk[105];
int f[105],h[105];
inline int q_pow(int A,int B,int P){
    int res=1;
    while(B){
        if(B&1) res=1ll*res*A%P;
        A=1ll*A*A%P;
        B>>=1;
    }
    return res;
}
int fact[105],fact_inv[105];
int C[105][105];
int Y[105][105];
int pre[105],suf[105];
inline int lagrange(int X,int K){
    pre[0]=1,suf[K+1]=1;
    for(int i=1;i<=K+1;++i) pre[i]=1ll*pre[i-1]*(X-(i-1)+mod)%mod;
    for(int i=K;i>=0;--i) suf[i]=1ll*suf[i+1]*(X-(i+1)+mod)%mod;
    int res=0;
    for(int i=0;i<=K+1;++i){
        int now=1ll*Y[K][i]*pre[i]%mod*suf[i]%mod*fact_inv[i]%mod*fact_inv[K+1-i]%mod;
        if((K+1-i)&1) res=(res-now+mod)%mod;
        else res=(res+now)%mod;
    }
    return res;
}
int ans;
int main(){
    n=read(),m=read(),k=read();
    for(int i=1;i<=m;++i) lim[i]=read();
    for(int i=1;i<=m;++i) rk[i]=read();
    C[0][0]=1;
    for(int i=1;i<=100;++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;
        }
    }
    fact[0]=1,fact_inv[0]=1;
    for(int i=1;i<=100;++i) fact[i]=1ll*fact[i-1]*i%mod;
    fact_inv[100]=q_pow(fact[100],mod-2,mod);
    for(int i=99;i>=1;--i) fact_inv[i]=1ll*fact_inv[i+1]*(i+1)%mod;
    for(int i=1;i<n+2;++i){
        int now=1;
        for(int j=0;j<n;++j){
            Y[j][i]=(Y[j][i-1]+now)%mod;
            now=1ll*now*i%mod;
        }
    }
    for(int i=1;i<=m;++i){
        int pw=1;
        for(int j=0;j<rk[i];++j){
            int now=1ll*C[rk[i]-1][j]*pw%mod*lagrange(lim[i],n-1-j)%mod;
            if((rk[i]-1-j)&1) h[i]=(h[i]-now+mod)%mod;
            else h[i]=(h[i]+now)%mod;
            pw=1ll*pw*lim[i]%mod;
        }
    }
    for(int i=k;i<n;++i){
        f[i]=C[n-1][i];
        for(int j=1;j<=m;++j){
            f[i]=1ll*f[i]*C[n-1-i][n-rk[j]-i]%mod*h[j]%mod;
        }
    }
    for(int i=k;i<n;++i){
        int now=1ll*C[i][k]*f[i]%mod;
        if((i-k)&1) ans=(ans-now+mod)%mod;
        else ans=(ans+now)%mod;
    }
    printf("%d\n",ans);
    return 0;   
}

标签:JLOI2016,洛谷,dbinom,int,题解,sum,times,res,105
From: https://www.cnblogs.com/SoyTony/p/Solution_about_Luogu_P3270.html

相关文章

  • 题解 CF277E【Binary Tree on Plane】
    费用流。可以将原问题转化为类似于匹配的问题,只不过这种匹配并不是一对一的。具体地,将每个点\(u\)拆成两个点\(u_\text{fa},u_\text{son}\),设源点为\(s\)、汇点为\(t......
  • 题解:【CODE FESTIVAL 2016 Grand Final】90 and 270
    题目链接经典增量构造题。不妨从是否存在构造开始考虑:根据多边形内角和的公式容易得出给定的度数和必须等于\((n-2)\times180^{\circ}\),才有解。换一个角度思考,又因......
  • 【题解】P4707 重返现世
    隔壁友校的初一已经开始做这种题了,准老年选手感到恐惧。思路Min-Max容斥。首先考虑到\(|n-k|\leq10\),感觉有大力做法,考虑用Min-Max容斥求期望。设全集\(U\)......
  • [AHOI2009] 中国象棋 题解
    每行每列的炮数量\(\leq2\),那么整个图就可以被分解为一些环和链。考虑答案的二元生成函数,显然环和链分别的生成函数都是平凡的多项式,而答案的多项式无非是加起来后求exp......
  • 黑白树 题解
    看了半天题解代码大概明白他在干啥了。写篇题解总结一下。题面:一棵树,每个点黑色或白色,有权值。五个操作:改变一个点颜色。使点\(x\)所在的同色连通块权值加\(val\)。......
  • CF468E Permanent 题解
    考虑暴力状压DP。按行DP,记录列哪些被选过,可以做到\(O(2^kk^2)\)。注意到某一列扫完了之后这一列选没选过不重要,可以减少这里的状态。简单优化一下,每次选择最少的一列......
  • CF1033E 题解
    题意传送门交互题,给定一个简单连通图,你可以询问一个点集\(s\),返回其导出子图的边数。判断此图是否为二分图:若是,输出其中一部点的集合;否则输出任一个奇环。最多询问\(20......
  • Good Bye 2022 简要题解
    从这里开始比赛目录过气选手留下了只会套路的眼泪。sad......ProblemA KoxiaandWhiteboards相信大家都会.jpgCode#include<bits/stdc++.h>using......
  • 题解:【CF226D】The table
    题目链接调整构造。发现\(n\)和\(m\)较小只有\(100\),因此可以考虑尝试进行修改从而不断逼近答案。容易发现如果将某一行或列上的数字翻转,那么得到的新的和一定与原......
  • 【题解】ABC287
    \(\text{AtCoderBeginnerContest287}\)AMajority无意义题,问同意的是不是占半数以上。BPostalCard无意义题,对一个字符串集合开桶,对应匹配另一个字符串集合。CPa......