20pts,RE,求调,谢谢!
查看原帖
20pts,RE,求调,谢谢!
1279044
_Abigail_楼主2025/8/5 16:28
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e8+7;
const ll MAXN=1e6+5;
ll n,m,sum,ppow;
ll dp[MAXN],f[MAXN],inv[MAXN];
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b>0)
    {
        if(b&1)res=res*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return res;
}
void p() {
    f[0] = 1;
    for (ll i = 1; i < MAXN; i++) {
        f[i] = f[i - 1] * i % mod;
    }
    inv[MAXN - 1] = qpow(f[MAXN - 1], mod - 2);
    for (ll i = MAXN - 2; i >= 0; i--) {
        inv[i] = inv[i + 1] * (i + 1) % mod;
    }
}
ll C(ll a,ll b)
{
    if(a<0||b<0||a<b)return 0;
    return f[a] * inv[b] % mod * inv[a - b] % mod;
}
int main()
{
    cin>>n>>m;
    memset(dp,-1,sizeof dp);
    p();
    ppow=qpow(2,n);
    dp[0]=1;
    dp[1]=0;
    for (ll i = 2; i <= m; i++) {
        ll t1 = C(ppow - 1, i - 1) * f[i - 1] % mod;
        ll t2 = dp[i - 1];
        ll t3 = (i - 1) * (ppow - i + 1) % mod * dp[i - 2] % mod;
        dp[i] = (t1 - t2 - t3 + 2 * mod) % mod; 
    }
    cout<<dp[m]*inv[m]%mod<<"\n";
    return 0;
}
2025/8/5 16:28
加载中...