/* * Opis: Główny nagłówek */ #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif constexpr int MAXN = 5e4 + 1; template<int N=8> void solve(int n) { if (n + 1 > N) { return solve<min(2*N, MAXN)>(n); } vector<bitset<N>> base(n); FOR(i, 1, n) { for (int j = i; j <= n; j += i) { base[i-1].set(j); } } int s; cin >> s; bitset<N> finish; REP(i, s) { int a; cin >> a; finish.set(a); } int wh = -1; bitset<N> curr; FOR(i, 1, n) { if (finish.test(i)) { wh = i; curr = base[i-1]; break; } } if (wh == -1) { cout << "1\n3 1\n"; return; } vector<array<int, 3>> solution; FOR(i, wh+1, n) { debug(curr); if (curr.test(i) != finish.test(i)) { if (finish.test(i)) { solution.push_back({1, wh, i}); curr = (curr | base[i-1]); wh = n + ssize(solution); } else { solution.push_back({3, i, -1}); int new_wh = n + ssize(solution); solution.push_back({2, wh, new_wh}); wh = new_wh + 1; curr = (curr & (~base[i-1])); } } } if (solution.empty()) { solution.push_back({3, wh, -1}); solution.push_back({3, n+1, -1}); } cout << ssize(solution) << "\n"; for (auto [type, a, b] : solution) { cout << type << " " << a; if (b != -1) { cout << " " << b; } cout << "\n"; } } int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; solve(n); /* int n, s; cin >> n >> s; vector<int> target(n + 1); REP(i, s) { int a; cin >> a; target[a] = 1; } vector<int> curr(n + 1); */ }
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 | /* * Opis: Główny nagłówek */ #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif constexpr int MAXN = 5e4 + 1; template<int N=8> void solve(int n) { if (n + 1 > N) { return solve<min(2*N, MAXN)>(n); } vector<bitset<N>> base(n); FOR(i, 1, n) { for (int j = i; j <= n; j += i) { base[i-1].set(j); } } int s; cin >> s; bitset<N> finish; REP(i, s) { int a; cin >> a; finish.set(a); } int wh = -1; bitset<N> curr; FOR(i, 1, n) { if (finish.test(i)) { wh = i; curr = base[i-1]; break; } } if (wh == -1) { cout << "1\n3 1\n"; return; } vector<array<int, 3>> solution; FOR(i, wh+1, n) { debug(curr); if (curr.test(i) != finish.test(i)) { if (finish.test(i)) { solution.push_back({1, wh, i}); curr = (curr | base[i-1]); wh = n + ssize(solution); } else { solution.push_back({3, i, -1}); int new_wh = n + ssize(solution); solution.push_back({2, wh, new_wh}); wh = new_wh + 1; curr = (curr & (~base[i-1])); } } } if (solution.empty()) { solution.push_back({3, wh, -1}); solution.push_back({3, n+1, -1}); } cout << ssize(solution) << "\n"; for (auto [type, a, b] : solution) { cout << type << " " << a; if (b != -1) { cout << " " << b; } cout << "\n"; } } int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; solve(n); /* int n, s; cin >> n >> s; vector<int> target(n + 1); REP(i, s) { int a; cin >> a; target[a] = 1; } vector<int> curr(n + 1); */ } |