分析
我的做法和这个博客几乎相同
只是我在处理$2^{2^{n-i}}-1$的时候是先处理前面的再处理后面的
所以前面的$2^{2^{n-i}}$我们只需要从$i=n$开始循环,每次平方即可
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<queue> #include<ctime> #include<vector> #include<set> #include<map> #include<stack> using namespace std; #define int long long const int mod = 1e9+7; int pw[1001000],inv[1001000]; inline int PW(int x,int p){ int res=1; while(p){ if(p&1)res=res*x%mod; x=x*x%mod; p>>=1; } return res; } inline int c(int n,int m){ return pw[n]*inv[m]%mod*inv[n-m]%mod; } signed main(){ int n,m,i,j,k,Ans=0,now=2; scanf("%lld%lld",&n,&k); inv[0]=pw[0]=1; for(i=1;i<=n;i++)pw[i]=pw[i-1]*i%mod; inv[n]=PW(pw[n],mod-2); for(i=n-1;i>0;i--)inv[i]=inv[i+1]*(i+1)%mod; for(i=n;i>=k;i--){ int wh=((i-k)%2==0?1:-1); Ans=(Ans+mod+wh*c(i,k)*c(n,i)%mod*(now-1+mod)%mod)%mod; now=now*now%mod; } cout<<Ans<<endl; return 0; }