专栏文章

题解:SP28304 ADATEAMS - Ada and Teams

SP28304题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miosxinh
此快照首次捕获于
2025/12/03 00:37
3 个月前
此快照最后确认于
2025/12/03 00:37
3 个月前
查看原文
首先,我们分析一下题意是什么。从 NN 所学校选出 AA 所,有 CNAC_N^A 种选法。每所学校从 BB 名学生选出 DD 名有 CBDC_B^D 种选法,选出了 AA 所学校,所以题目就是让我们求 CNA×(CBD)AC_N^A \times {(C_B^D)}^A
现在的问题就是如何算这个式子。我们知道:
Cnm=n×(n1)×...×nm+11×2×...×mC_n^m=\frac{n\times (n-1) \times ... \times n-m+1}{1\times 2\times ... \times m}
即:
Cnm=n!(nm)!m!C_n^m=\frac{\frac{n!}{(n-m)!}}{m!}
所以我们可以提前处理出前缀和。但是,这里涉及除法,又要取模。所以我们要求逆元。不会的可以参考这道题的题解。
对于 (CBD)A{(C_B^D)}^A,写一个快速幂即可。
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
ll n,a,b,d,fac[1000001];
int qpow(int a,int b){
    int t=1;
    ll c=a,r=1;
    while(t<=b){
        if(t&b){
            r*=c;
            r%=mod;
        }
        c*=c;
        c%=mod;
        t<<=1;
    }
    return r;
}
int inv(int p){
    return qpow(p,mod-2);
}
ll c(ll x,ll y){
    return 1ll*fac[x]*inv(fac[x-y])%mod*inv(fac[y])%mod;
}
int main(){
    fac[0]=1;
    for(int i=1;i<=1e6;i++){
        fac[i]=fac[i-1]*i%mod;
    }
    while(~scanf("%lld%lld%lld%lld",&n,&a,&b,&d)){
        printf("%lld\n",qpow(c(b,d),a)*c(n,a)%mod);
    }
    return 0;
}
好了,最后祝大家做题愉快,满屏 AC!

评论

2 条评论,欢迎与作者交流。

正在加载评论...