首先是数学问题:划分
可以把问题看成n个点,取k个点有几种不同的方案
情况1:这k个点在两端,有2种情况,还剩n-k-1个位置用来划分
情况2:这k个点不在两端,有n-k+1-2种情况,还剩n-k-2个位置用来划分
于是2*2^(n-k-1)+(n-k-1)*2^(n-k-2) 化简为 (n-k+3)*2^(n-k-2)
然后2的(n-k-2)次方会超时,那么就要用降幂法优化
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
LL n,k,ans;
LL solve(LL n,LL k){
LL rst=(n-k+3);
LL p=n-k-2,a=2;
if(p<-2) return 0;
if(p==-2) return 1;
if(p==-1) return 2;
while(p){
if(p&1)
rst=(rst*a)%mod;
a=(a*a)%mod;
p/=2;
}
return rst;
}
int main(){
int tt;
for(cin>>tt;tt>0;tt--){
cin>>n>>k;
ans=solve(n,k);
cout<<ans<<endl;
}
return 0;
}