Statement
DP时初始状态尽量简单
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2e5+10,M=1e9+7;
ll T,n,k;
//sc=sum of all x(even & <=n) C(n,x)
/* (x+1)^n=x^n+C(n,1)x^n-1+...+C(n,n-1)x+1
n odd (x-1)^n=x^n-C(n,1)x^n-1+...+C(n,n-1)x-1
+ 2^(n-1)=x^n+C(n,2)x^n-2+...+C(n,n-1)=sc[n]
sc[n]=2^(n-1)
1 1 4 7 16 31
************************************************************
(x+1)^n=x^n+C(n,1)x^n-1+...+C(n,n-1)x+1
n even (x-1)^n=x^n-C(n,1)x^n-1+...-C(n,n-1)x+1
+ 2^(n-1)=x^n+C(n,2)x^n-2+...+C(n,n-2)+1=sc[n]
sc[n]=2^(n-1)
*/
ll qp(ll a,ll b){ll r=1;while(b){if(b&1)r=r*a%M;a=a*a%M,b>>=1;}return r;}
ll dp[N][2];
int main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
ll sc=qp(2,n-1);
if(k==0){printf("1\n");continue;}
memset(dp,0,sizeof(dp));
dp[0][0]=0;
dp[0][1]=1;
ll pw=qp(2ll,n);
for(int i=1;i<=k;i++)
{
if(n%2)
{
dp[i][0]=dp[i-1][0]*pw;
dp[i][1]=dp[i-1][1]*(sc+1);
}
else
{
dp[i][0]=dp[i-1][0]*pw+dp[i-1][1]*1;
dp[i][1]=dp[i-1][1]*(sc-1);
}
dp[i][0]%=M;
dp[i][1]%=M;
}
printf("%lld\n",(dp[k][0]+dp[k][1])%M);
}
}