一看数据范围就是推公式的题目
公式
((1 / 8) * m + 1 / 4) * 2 ^ m
其中
m = n - k + 1
注意要用 C++ 和 I64d 为此我贡献了一发 TLE 和一发 OET! QAQ
附代码(31MS):
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long LL;
const LL MOD = 1e9 + 7;
LL fastPow(LL n){
LL a = 2, res = 1;
while(n){
if(n & 1){
res = (res * a) % MOD;
}
n >>= 1;
a = (a * a) % MOD;
}
return res;
}
int main(){
LL n, k, t;
scanf("%I64d", &t);
while(t --){
scanf("%I64d%I64d", &n, &k);
LL m = n - k + 1;
if(k > n)
puts("0");
else if(k == n)
puts("1");
else if(k == n - 1)
puts("2");
else if(k == n - 2)
puts("5");
else
printf("%I64d\n", ((m + 2) * fastPow(m - 3)) % MOD);
}
return 0;
}