舔狗舔到最后一无所有(DP)
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define go continue #define int long long #define PII pair<int, int> #define sf(x) scanf("%lld",&x) #define pf(x) printf("%lld\n",x) #define ytz int _; sf(_); while(_--) #define fory(i,a,b) for(int i = a; i <= b; ++i) #define forl(i,a,b) for(int i = a; i >= b; --i) #define debug(a) cout << #a << " = " << a <<endl; const int mod = 1e9 + 7; const int N = 100010; /**\ https://ac.nowcoder.com/acm/contest/24213/1002 f[i][j] 表示前i天中且第i天去第j家的方案数 以f[i][0]为例, 第i天去第0家,我们讨论第i - 1天是否去了第0家 1、i - 1天 不去第0家 : f[i][0] += f[i - 1][1] + f[i - 1][2] 2、i - 1天 去第0家 : f[i][0] += f[i - 2][1] + f[i - 2][2] 第i - 2天不能去第0家,不然就连续三天吃了同一家 \**/ int n, f[N][3]; signed main() { f[0][0] = f[0][1] = f[0][2] = 0; f[1][0] = f[1][1] = f[1][2] = 1; f[2][0] = f[2][1] = f[2][2] = 3; fory(i, 3, 100000) { f[i][0] = (f[i - 1][1] + f[i - 1][2] + f[i - 2][1] + f[i - 2][2]) % mod; f[i][1] = (f[i - 1][0] + f[i - 1][2] + f[i - 2][0] + f[i - 2][2]) % mod; f[i][2] = (f[i - 1][0] + f[i - 1][1] + f[i - 2][0] + f[i - 2][1]) % mod; } ytz { int x; sf(x); printf("%lld\n", (f[x][0] + f[x][1] + f[x][2]) % mod); } return 0; }