第一次做高校联合的题目,有两个感受
首先 :我的水平太差了
其次 :感觉题的坑太多了 (这应该是我的水平太低 思维不够缜密导致的吧)
这道题应该算是数论的题吧 看着解题报告做的
下面说说解题报告
我们可以特判出 n <= k的情况。 的情况。
对于 1 <= k < n,我们可以等效为 n个点 排成一列,并取出其中的连续k个点 。下面分两种 情况考虑:
第一种情况,被选出的不包含端点那么有 (n – k − 1)种情况完成上述操作,剩下未被圈的点之间还有 (n – k − 2)个位置,可以在每个位置断开,所以共 2^( n−k−2 ) ∗ (n−k−1) 种方法。
第二种情况, 即被选出的包含端点,那么有 2种情况,并且剩余共 (n – k − 1)个位置,所以共 2 ∗ 2^( n – k − 1)种方法。
总计 2 ∗ 2^( n – k − 1) + 2^( n – k − 2) ∗ (n – k − 1) = (n – k + 3) * 2^( n – k − 2)。
#include<cstdio>
#include<cstring>
#define LL __int64
const LL maxn = 1000000007;
LL pow_mod(LL a, LL n, LL maxn)
{
if( !n )return 1;
if(n == 1)return a%maxn;
LL ans = pow_mod(a,n/2,maxn);
ans = ans*ans%maxn;
if(n%2==1)ans = ans*a%maxn;
return ans;
}
int main()
{
int T;
scanf("%d",&T);
for(int i = 0; i < T; i++)
{
LL k,n;
scanf("%I64d%I64d",&n,&k);
if(n < k)printf("0\n");
else
if(n-k==1)printf("2\n");
else if(n-k==0)printf("1\n");
else
{
LL a;
a = (pow_mod(2,n-k-2,maxn)*((n-k+3)%maxn))%maxn;
printf("%I64d\n",a);
}
}
}