-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathD.cpp
More file actions
152 lines (115 loc) · 3.96 KB
/
Copy pathD.cpp
File metadata and controls
152 lines (115 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <bits/stdc++.h>
using namespace std;
#ifndef HELLO_PEOPLE
#define cerr if(0) cout
#endif
using ll = long long;
using ld = long double;
#define all(v) (v).begin(), (v).end()
#define X first
#define Y second
template<class T> struct Nit { T _v, _s; Nit(T v, T s) : _v(v), _s(s) {} operator T &() { return _v; } T operator *() const { return _v; } Nit &operator++() { _v += _s; return *this; } bool operator!=(Nit &a) { return (_s > 0 ? _v < a._v : _v >= a._v);} };
template<class T = int> struct range { T _b, _e, _s; range(T e) : _b(0), _e(e), _s(1) {} range(T b, T e, T s = 1) : _b(b), _e(e), _s(s) {} Nit<T> begin() { return Nit<T>(_b, _s); } Nit<T> end() { return Nit<T>(_e, _s); } };
template<class T = int> struct rrange : range<T> { rrange(T e, T b, T s = 1) : range<T>(e, b, -s) {} rrange(T e) : range<T>(e, 0, -1) {} };
template<int D, class T> struct vec : public vector<vec<D - 1, T>> { template<class... Args> vec(int n = 0, Args... a) : vector<vec<D - 1, T>>(n, vec<D - 1, T>(a...)) {} };
template<class T> struct vec<1, T> : public vector<T> { vec(int n = 0, T const &val = T()) : vector<T>(n, val) {} };
template<typename T>
struct Modular {
long long val;
static int constexpr mod() { return T::value; };
Modular(long long v = 0) {
val = v % mod();
if (val < 0) val += mod();
}
Modular(long long a, long long b) : val(0) {
*this += a;
*this /= b;
}
Modular &operator+=(Modular const &b) {
val += b.val;
if (val >= mod()) val -= mod();
return *this;
}
Modular &operator-=(Modular const &b) {
val -= b.val;
if (val < 0) val += mod();
return *this;
}
Modular &operator*=(Modular const &b) {
val = (long long) val * b.val % mod();
return *this;
}
friend Modular mexp(Modular a, long long e) {
Modular res = 1;
while (e) {
if (e & 1) res *= a;
a *= a;
e >>= 1;
}
return res;
}
friend Modular inverse(Modular a) {
return mexp(a, mod() - 2);
}
Modular &operator/=(Modular const &b) {
return *this *= inverse(b);
}
friend Modular
operator+(Modular a, Modular const b) { return a += b; }
friend Modular
operator-(Modular a, Modular const b) { return a -= b; }
friend Modular operator-(Modular const a) {
return 0 - a;
}
friend Modular
operator*(Modular a, Modular const b) { return a *= b; }
friend Modular
operator/(Modular a, Modular const b) { return a /= b; }
friend Modular operator%(Modular a, Modular const b) {
return a.val %= b.val;
}
friend std::ostream &
operator<<(std::ostream &os, Modular const &a) {
return os << a.val;
}
#define IMPLEMENT_COMPARE_OPERATOR(x) \
friend bool operator x (Modular const& a, Modular const& b) { \
return a.val x b.val; \
}
IMPLEMENT_COMPARE_OPERATOR(<)
IMPLEMENT_COMPARE_OPERATOR(>)
IMPLEMENT_COMPARE_OPERATOR(<=)
IMPLEMENT_COMPARE_OPERATOR(>=)
IMPLEMENT_COMPARE_OPERATOR(==)
IMPLEMENT_COMPARE_OPERATOR(!=)
};
//struct VarMod { static int value; };
//int VarMod::value;
//int &MOD = VarMod::value;
//using Mint = Modular<VarMod>;
int constexpr MOD = 1e9 + 7;
using Mint = Modular<std::integral_constant<int, MOD>>;
// now start
ll const INF = 1e14;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int const N = 2e6 + 10;
vector<Mint> cnt0(N), cnt1(N), cnt3(N), dp(N);
cnt0[1] = 1, cnt1[1] = 0, cnt3[1] = 0;
for (auto i : range<>(2, N)) {
cnt1[i] = cnt0[i - 1];
cnt3[i] = cnt3[i - 1] + cnt1[i - 1];
cnt0[i] = cnt0[i - 1] + (cnt1[i - 1] * 2);
dp[i] = cnt1[i - 1] + (i > 3 ? dp[i - 3] : 0);
// if (i <= 10) cerr << cnt3[i] << ' ' << cnt1[i] << ' ' << dp[i] << '\n';
}
int tc;
cin >> tc;
while (tc--) {
int n;
cin >> n;
cout << dp[n] * 4 << '\n';
}
return 0;
}