【贡献法】(数论)

【贡献法】(数论)

一般结合计数原理/组合数学

中位数

https://ac.nowcoder.com/acm/contest/111309/F
image
知识点:
(1)组合数递推打表
(2)降幂:费马小定理
image
注意在前面的取mod下取(mod-1),在最后的操作上取mod(费马小定理逆运算)

const ll mod=1610612741;
const ll mod_phi=1610612740;
const int N=6e3+10;
ll add(ll x,ll y,ll mod){
    ll res=(x+y)%mod;
    return res;
}
ll qmi(ll a,ll k,ll p){
    ll ans=1;
    while(k){
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a%p;
    }
    return ans;
}
ll n;
ll C[N][N],f[N];
void init(){
    f[0]=1LL;
    for(int i=1;i<=6e3;i++){
        if(i==1) f[i]=1LL;
        f[i]=f[i-1]*(ll)i%mod_phi;
    }
    for(int i=0;i<=6e3;i++){
        C[i][0]=1LL;
        C[i][i]=1LL;
        for(int j=1;j<i;j++){
            C[i][j]=add(C[i-1][j-1],C[i-1][j],mod_phi);
        }
    }
}
void solve(){
    cin>>n;
    ll ans=1LL;
    for(int mid=2;mid<=n;mid++){
        ll tot=0;
        for(int len=1;len<=n;len++){
            int x=len/2,y=len-x-1;
            int p=mid-1,q=n-mid;
            ll cnt=(C[p][x]*C[q][y])%mod_phi;
            cnt=(cnt*f[len])%mod_phi;
            cnt=(cnt*f[n-len])%mod_phi;
            cnt=(cnt*((ll)n-(ll)len+1LL))%mod_phi;
            tot=add(tot,cnt,mod_phi);
        }
        ans=(ans*qmi((ll)mid,tot,mod))%mod;
    }
    cout<<ans<<endl;
}
posted @ 2025-05-31 00:14  White_ink  阅读(12)  评论(0)    收藏  举报