题意 :一个圆环,每个位置可以选择 2 k 2^k 2k中任意一个数,要求相邻位置异或不等于 2 k − 1 2^k -1 2k−1
>> face <<
Strategy:DP
状态: (本来没考虑头尾完全想法的情况疯狂wa)
d p [ i ] [ 0 ] : 头 和 尾 不 完 全 相 同 , 不 完 全 相 反 d p [ i ] [ 1 ] : 头 和 尾 完 全 相 同 d p [ i ] [ 2 ] : 头 和 尾 完 全 相 反 dp[i][0]:头和尾不完全相同,不完全相反 \\ dp[i][1]:头和尾完全相同\\ dp[i][2]:头和尾完全相反 dp[i][0]:头和尾不完全相同,不完全相反dp[i][1]:头和尾完全相同dp[i][2]:头和尾完全相反
边界: dp[1][1] = m, 一定注意边界条件一定要 从开头来推
转移:
{ d p [ i ] [ 0 ] = ( d p [ i − 1 ] [ 0 ] ∗ ( m − 3 ) + d p [ i − 1 ] [ 1 ] ∗ ( m − 2 ) + d p [ i − 1 ] [ 2 ] ∗ ( m − 2 ) ) % m o d , d p [ i ] [ 1 ] = ( d p [ i − 1 ] [ 1 ] + d p [ i − 1 ] [ 0 ] ) % m o d , d p [ i ] [ 2 ] = ( d [ i − 1 ] [ 2 ] + d p [ i − 1 ] [ 0 ] ) % m o d , \begin{dcases}dp[i][0] = (dp[i-1][0]*(m - 3) + dp[i -1][1]*(m - 2) + dp[i - 1][2]*(m - 2)) \%mod,\\ dp[i][1] = (dp[i-1][1] + dp[i - 1][0])\%mod,\\ dp[i][2] = (d[i-1][2] + dp[i - 1][0])\%mod, \end{dcases} ⎩⎪⎨⎪⎧dp[i][0]=(dp[i−1][0]∗(m−3)+dp[i−1][1]∗(m−2)+dp[i−1][2]∗(m−2))%mod,dp[i][1]=(dp[i−1][1]+dp[i−1][0])%mod,dp[i][2]=(d[i−1][2]+dp[i−1][0])%mod,
attention: 边界要从1开始, 状态还是要缜密
#include <bits/stdc++.h>
#include <bits/extc++.h>
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define all(a) a.begin(), a.end()
#define met(a, b) memset(a, b, sizeof(a))
#define what_is(x) cout << #x << " is " << x << endl
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define lowbit(x) x &(-x)
#define bin(x) cout << #x << " is " << bitset<sizeof(int) * 2>(x) << endl
#define pi acos(-1.0)
using namespace std;
using namespace __gnu_pbds;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const db eps = 1e-8;
vector<ll> pow2(maxn);
ll dp[maxn][3];
int main()
{
pow2[0] = 1;
_for(i, 1, maxn)
{
pow2[i] = pow2[i - 1] * 2 % mod;
//what_is(pow2[i]);
}
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
met(dp, 0);
ll m = pow2[k];
dp[1][1] = m;
_rep(i, 2, n)
{
dp[i][1] = (dp[i - 1][1] + dp[i - 1][0]) % mod;
dp[i][2] = (dp[i - 1][2] + dp[i - 1][0]) % mod;
dp[i][0] = ((dp[i - 1][2] + dp[i - 1][1]) * (m - 2) + dp[i - 1][0] * (m - 3)) % mod;
}
cout << (dp[n][1 ] + dp[n][0]) % mod << endl;
}
}