BZOJ 2339 卡农(组合数学)

时间:2023-03-09 14:53:51
BZOJ 2339 卡农(组合数学)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2339

题意:

BZOJ 2339 卡农(组合数学)

思路:

BZOJ 2339 卡农(组合数学)

i64 Pow(i64 a,i64 b,i64 mod)
{
    i64 ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}

i64 n,m;
i64 g[N],f[N];

i64 exGcd(i64 a,i64 b,i64 &x,i64 &y)
{
    if(b==0)
    {
        x=1; y=0;
        return a;
    }
    i64 temp=exGcd(b,a%b,x,y);
    i64 t=x;
    x=y;
    y=t-a/b*y;
    return temp;
}

i64 reverse(i64 a,i64 b)
{
    i64 x,y;
    exGcd(a,b,x,y);
    x=(x%b+b)%b;
    return x;
}

void init()
{
    i64 i,a=Pow(2,n,mod)-1;
    g[0]=1;
    FOR1(i,m) g[i]=g[i-1]*(a+1-i)%mod;
}

int main()
{
    RD(n,m);
    init();
    i64 a=Pow(2,n,mod)-1,i;
    f[1]=f[2]=0;
    for(i=3;i<=m;i++)
    {
        f[i]=g[i-1]-f[i-1]-f[i-2]*(i-1)%mod*(a-(i-2))%mod;
        f[i]%=mod;
    }
    if(f[m]<0) f[m]+=mod;
    a=1;
    FOR1(i,m) a=a*i%mod;
    a=reverse(a,mod);
    f[m]=f[m]*a%mod;
    PR(f[m]);
}