#include <bits/stdc++.h> using namespace std; typedef long long ll; #define vc vector #define st first #define nd second #define pll pair<ll, ll> #define sz(a) (ll)a.size() #define all(a) a.begin(), a.end() #define pu push #define pub push_back #define pob pop_back #define em emplace #define emb emplace_back ll n; vc<ll> a; void input() { cin >> n; a.resize(n); for (ll &ai : a) cin >> ai; } void tran(ll i, ll j, ll k, vc<set<ll>> &tmp) { ll z = max(0ll, (k - (j == 0) - (j + k == 0)) / 2); if (k - z > a[i]) return; tmp[j].insert(-k + 2 * a[i]); } bool solve() { while (a.back() == 0) a.pob(); reverse(all(a)); while (a.back() == 0) a.pob(); reverse(all(a)); n = sz(a); vc<set<ll>> dp(2); dp[0].insert(0); for (ll i = 0; i < n; i++) { vc<set<ll>> tmp(2); for (ll j = 0; j < 2; j++) for (ll k : dp[j]) { tran(i, j, k, tmp); if (j == 0) tran(i, 1, k + 1, tmp); if ((j + k) % 2 == 0) tran(i, j, k + 1, tmp); if (j == 0 and (j + k) % 2 == 0) tran(i, 1, k + 2, tmp); } if (i + 1 < n) { tmp[0].erase(0); tmp[1].erase(0); } swap(dp, tmp); } return dp[1].find(0) != dp[1].end(); } void program() { input(); if (solve()) cout << "TAK\n"; else cout << "NIE\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll T = 1; cin >> T; while (T--) { program(); } return 0; }
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #define vc vector #define st first #define nd second #define pll pair<ll, ll> #define sz(a) (ll)a.size() #define all(a) a.begin(), a.end() #define pu push #define pub push_back #define pob pop_back #define em emplace #define emb emplace_back ll n; vc<ll> a; void input() { cin >> n; a.resize(n); for (ll &ai : a) cin >> ai; } void tran(ll i, ll j, ll k, vc<set<ll>> &tmp) { ll z = max(0ll, (k - (j == 0) - (j + k == 0)) / 2); if (k - z > a[i]) return; tmp[j].insert(-k + 2 * a[i]); } bool solve() { while (a.back() == 0) a.pob(); reverse(all(a)); while (a.back() == 0) a.pob(); reverse(all(a)); n = sz(a); vc<set<ll>> dp(2); dp[0].insert(0); for (ll i = 0; i < n; i++) { vc<set<ll>> tmp(2); for (ll j = 0; j < 2; j++) for (ll k : dp[j]) { tran(i, j, k, tmp); if (j == 0) tran(i, 1, k + 1, tmp); if ((j + k) % 2 == 0) tran(i, j, k + 1, tmp); if (j == 0 and (j + k) % 2 == 0) tran(i, 1, k + 2, tmp); } if (i + 1 < n) { tmp[0].erase(0); tmp[1].erase(0); } swap(dp, tmp); } return dp[1].find(0) != dp[1].end(); } void program() { input(); if (solve()) cout << "TAK\n"; else cout << "NIE\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll T = 1; cin >> T; while (T--) { program(); } return 0; } |