4 条题解

  • 0
    @ 2024-10-3 9:21:29
    #include<bits/stdc++.h>
    #define ull unsigned long long
    using namespace std;
    struct modint
    {
        ull x;
        int pw2;
        modint(){x=0,pw2=0;}
        modint(ull _x,int _pw2){x=_x,pw2=_pw2;}
        modint(ull val)
        {
            assert(val);
            pw2=__builtin_popcountll(val^val-1)-1;
            x=val>>pw2;
        }
    };
    ull decode(modint x)
    {
        assert(x.pw2>=0);
        return x.x<<x.pw2;
    }
    ull inv(ull x)
    {
        assert(x&1);
        ull ret=1;
        for(int i=63;i--;)ret=ret*x,x=x*x;
        return ret;
    }
    modint inv(modint x)
    {
        return modint{inv(x.x),-x.pw2};
    }
    modint operator*(modint x,modint y)
    {
        return modint{x.x*y.x,x.pw2+y.pw2};
    }
    ull qpow(ull x,ull y)
    {
        ull ret=1;
        while(y)
        {
            if(y&1)ret=ret*x;
            x=x*x;
            y>>=1;
        }
        return ret;
    }
    modint Inv[70],fac[70],invfac[70];
    ull pwm[70];
    ull n,m;
    int main()
    {
        scanf("%llu%llu",&m,&n);
        if(m==0)
        {
            printf("%llu\n",n);
            return 0;
        }
        for(int i=0;i<=65;i++)pwm[i]=qpow(i,m);
        fac[0]=invfac[0]=modint(1);
        for(int i=1;i<=65;i++)fac[i]=fac[i-1]*modint(i),invfac[i]=inv(fac[i]);
        modint binom=modint(n);
        ull ans=0;
        for(int t=1;t<=65&&t<=m&&t<n;t++)
        {
            binom=binom*modint(n-t);
            binom=binom*inv(modint(t+1));
            ull stirling=0;
            for(int k=0;k<=t;k++)
            {
                ull x=decode(fac[t]*invfac[k]*invfac[t-k])*pwm[k];
                if(t-k&1)stirling-=x;
                else stirling+=x;
            }
            ans+=decode(binom)*stirling;
        }
        printf("%llu\n",ans);
        return 0;
    }
    

    信息

    ID
    3214
    时间
    200ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    15
    已通过
    2
    上传者