题目链接<https://nanti.jisuanke.com/t/31453>
题意:
一共有0~种面具,n个人围成一圈,每个人带一个面具。要求相邻两人的同或不能为0。问有几种情况。
题解:
表示与第一个人相同,
表示与第一个人非法,
表示与第一个人无关。
转移一下就可以出结果。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll N=1e6+7;
ll qpow(ll a,ll b){
ll ans=1;a%=mod;
for(ll i=b;i;i>>=1,a=a*a%mod)
if(i&1)ans=ans*a%mod;
return ans;
}
ll dp[N][3];
int main()
{
ll t,n,k,p;
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&k);
p=qpow(2,k);
if(n==1) printf("%lld\n",p);
else if(k==1) printf("2\n");
else{
dp[1][0]=p;
for(int i=2;i<=n;i++){
dp[i][0]=(dp[i-1][0]+dp[i-1][2])%mod;
dp[i][1]=(dp[i-1][1]+dp[i-1][2])%mod;
dp[i][2]=(dp[i-1][0]*(p-2)%mod+dp[i-1][1]*(p-2)%mod+dp[i-1][2]*(p-3)%mod)%mod;
}
printf("%lld\n",(dp[n][0]+dp[n][2])%mod);
}
}
return 0;
}