n-k<=1的特判。。
剩下的 推出公式求解
2^(n-k)+(n-k-1)*2^(n-k-2)
用快速幂 ac
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long lld;
const lld mod = 1000000007;
lld ksm (int n)
{
lld ans=1,t=2;
while(n)
{
if(n&1) ans=ans*t%mod;
t=t*t%mod;
n>>=1;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
cin>>n>>k;
if(n<k)
{
puts("0");
continue;
}
else if(n-k==0)
{
puts("1");
continue;
}
else if(n-k==1)
{
puts("2");
continue;
}
lld ans;
ans=(ksm(n-k)+(lld)(n-k-1)*ksm(n-k-2)%mod)%mod;
cout<<ans<<endl;
}
}