#include #include #include #include #include using namespace std; #define MEM(a,b) memset(a,(b),sizeof(a)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MP make_pair #define pb push_back #define M 1000000007 #define maxn 1000000000 #define maxm 30 #define maxt 10 typedef long long LL; LL maxp = 1; int m; struct matrix { int m[60][60]; }; void multiply(matrix &A,matrix &B,matrix &C) { int i,j,k; for(i=0;i<2*m;i++) for(j=0;j<2*m;j++) { LL v=0; for(k=0;k<2*m;k++) { v += (LL)A.m[i][k]*B.m[k][j] ; if(v>=maxp) v%=M; } C.m[i][j]=v%M; } } matrix base,now,tmp; int main() { int i,j,k,n,T; for(i=0;i<17;i++) maxp*=10; scanf("%d",&T); assert(T>=1 && T<=maxt); while(T--) { scanf("%d%d",&n,&m); assert(n>=1 && n<=maxn && m>=1 && m<=maxm); MEM(base.m,0); // entry x corresponds to staying at column x of an odd row if x=m for(i=0;i=0) base.m[i][i-1+m]=1; if(i+1=0) base.m[i+m][i-1]=1; base.m[i+m][i]=1; if(i+1=0;i--) { if(n&(1<