用到了二分幂算法和公式;
罗列一到五可得到规律;
1 2 3 4 5
1 1
2 2 1
3 3 2 1
4 12 5 2 1
5 28 12 5 2 1
所以可以得到公式
A1=1 (n=1)
An=2^(n-1)+(n-2)*2^(n-3) (n>=2)
#include"stdio.h"
#define M 1000000007
__int64 fun(__int64 a,__int64 b)
{
__int64 ans=1;
a=a%M;
while(b)
{
if(b%2)
ans=ans*a%M;
a=a%M*a%M;
b=b/2;
}
return ans%M;
}
int main()
{
int k;
__int64 m,n,p,h;
scanf("%d",&k);
while(k--)
{
scanf("%I64d%I64d",&m,&n);
h=m-n+1;
if(h<=0)
{
printf("0\n");
continue;
}
if(h==1)
{
printf("1\n");
continue;
}
p=fun(2,h-1)%M+(h-2)%M*fun(2,h-3)%M;
printf("%I64d\n",p%M);
}
return 0;
}