比赛 组合计数1 评测结果 AAAAAAAAAAAAAAAAWWWW
题目名称 组合数问题 最终得分 80
用户昵称 郑霁桓 运行时间 0.339 s
代码语言 C++ 内存使用 5.75 MiB
提交时间 2026-02-26 09:55:28
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,p,k,r,s1[2000005],s2[2000005],as;
long long C(long long x,long long y){
    if(x<0||y<0||y<x) return 0;
    return s1[y]*s2[x]%p*s2[y-x]%p;
}
inline long long pw(long long x,long long y){
    long long ss=1;
    while(y){
        if(y&1) ss*=x,ss%=p;
        x*=x,x%=p;
        y>>=1;
    }
    return ss;
}
int main(){
    freopen("problem.in","r",stdin);
    freopen("problem.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n>>p>>k>>r,s1[0]=s2[0]=s2[1]=1;
    if(k==1){
        cout<<pw(2,n);
        return 0;
    }else if(k==2){
        cout<<pw(2,n+n-1);
        return 0;
    }else if(p==2){
        cout<<0;
        return 0;
    }
    if(n*k<=1e6){
        for(int i=1;i<=n*k;i++) s1[i]=s1[i-1]*i%p;
        for(int i=2;i<=n*k;i++) s2[i]=(p-p/i)*s2[p%i]%p;
        for(int i=1;i<=n*k;i++) s2[i]=s2[i]*s2[i-1]%p;
        for(int i=0;i<=n;i++){
            as+=C(i*k+r,n*k);
            as%=p;
        }
        cout<<as;
    }
    return 0;
}