#include <bits/stdc++.h> using namespace std; array <vector<int>,50001>d; unsigned long long x; //array<unsigned short int,3> y; vector <array<unsigned int,3>>p; bool r[1000000]; unsigned long long t,f,k,s; bitset<12500> w[450001]; bitset<12500> v[4]; unsigned long long n,m,q,i,j,a,b,c; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> s; for (i=1;i<=n;i++) for(j=i;j<=n;j+=i) d[j].push_back(i); j=0; for (j=0;j<s;j++) { cin >> c; c--; v[c/12500].set(c%12500); } f=0; for(k=0;k<50000 ;k+=12500) { for(j=0;j<=n;j++) w[j].reset(); for(i=k;i<n && i-k<12500;i++){ for(auto s:d[i+1]) { w[s].set(i-k); } } m=n; for(auto y:p) { m++; if(y[0]==3) w[m]=~w[y[1]]; else if (y[0]==1) w[m]=w[y[1]]|w[y[2]]; else w[m]=w[y[1]]&w[y[2]]; } for(j=k; j<n && j-k<12500;j++) { if(w[m].test(j-k)>v[f].test(j-k)){ p.push_back({3,j+1,0}); p.push_back({2,m+1,m}); w[m+1]=~w[j+1]; w[m+2]=w[m+1]&w[m]; m+=2; } else if (w[m].test(j-k)<v[f].test(j-k)){ p.push_back({1,j+1,m}); w[m+1]=w[m]|w[j+1]; m+=1; } } f++; } cout << m-n << '\n'; for(auto y:p) { cout << y[0] << ' ' << y[1]; if(y[0]<3) cout << ' ' << y[2]; cout << '\n'; } }
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 | #include <bits/stdc++.h> using namespace std; array <vector<int>,50001>d; unsigned long long x; //array<unsigned short int,3> y; vector <array<unsigned int,3>>p; bool r[1000000]; unsigned long long t,f,k,s; bitset<12500> w[450001]; bitset<12500> v[4]; unsigned long long n,m,q,i,j,a,b,c; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> s; for (i=1;i<=n;i++) for(j=i;j<=n;j+=i) d[j].push_back(i); j=0; for (j=0;j<s;j++) { cin >> c; c--; v[c/12500].set(c%12500); } f=0; for(k=0;k<50000 ;k+=12500) { for(j=0;j<=n;j++) w[j].reset(); for(i=k;i<n && i-k<12500;i++){ for(auto s:d[i+1]) { w[s].set(i-k); } } m=n; for(auto y:p) { m++; if(y[0]==3) w[m]=~w[y[1]]; else if (y[0]==1) w[m]=w[y[1]]|w[y[2]]; else w[m]=w[y[1]]&w[y[2]]; } for(j=k; j<n && j-k<12500;j++) { if(w[m].test(j-k)>v[f].test(j-k)){ p.push_back({3,j+1,0}); p.push_back({2,m+1,m}); w[m+1]=~w[j+1]; w[m+2]=w[m+1]&w[m]; m+=2; } else if (w[m].test(j-k)<v[f].test(j-k)){ p.push_back({1,j+1,m}); w[m+1]=w[m]|w[j+1]; m+=1; } } f++; } cout << m-n << '\n'; for(auto y:p) { cout << y[0] << ' ' << y[1]; if(y[0]<3) cout << ' ' << y[2]; cout << '\n'; } } |