1 条题解

  • 0
    @ 2026-7-4 11:06:46

    #include <cstdio>
    #define int long long
    const int MOD = 1e8+7;
    const int M = 1000005;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,pw,fac,f[M],A[M];
    int qkpow(int a,int b)
    {
    	int r=1;
    	while(b>0)
    	{
    		if(b&1) r=r*a%MOD;
    		a=a*a%MOD;
    		b>>=1;
    	}
    	return r;
    }
    signed main()
    {
    	n=read();m=read();pw=A[0]=f[0]=fac=1;
    	for(int i=1;i<=n;i++) pw=pw*2%MOD;
    	for(int i=1;i<=m;i++) fac=fac*i%MOD;
    	for(int i=1;i<=m;i++) A[i]=A[i-1]*(pw-i)%MOD;
    	for(int i=1;i<=m;i++)
    	{
    		f[i]=A[i-1]-f[i-1];
    		if(i>1) f[i]-=f[i-2]*(i-1)%MOD*(pw-i+1)%MOD;
    		f[i]=(f[i]%MOD+MOD)%MOD;
    	}
    	printf("%lld\n",f[m]*qkpow(fac,MOD-2)%MOD);
    }
    
    
    • 1

    信息

    ID
    4004
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者