题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=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]);
}