#include<cstdio> #include<vector> #include<math.h> int isNoPrime[50007]; void printNeg(int i) { printf("3 %d\n", i); } std::vector<unsigned> sito(int n) { std::vector<unsigned> primes{}; int m = int(std::sqrt(n)+1.0); for(int i=2; i<=m; i++) { if(isNoPrime[i]) continue; primes.push_back(i); for(int j=2*i; j<=n; j+=i) { isNoPrime[j] = true; } } for(unsigned i=m+1; i<=n; i++) { if(isNoPrime[i]) continue; primes.push_back(i); } return primes; } int main() { int n, s; scanf("%d %d", &n, &s); int operations=0; std::vector<int> bases{}; std::vector<std::vector<int>> intersections{}; std::vector<int> numberOfSetsToSum{}; const auto primes = sito(n); for(int i=0; i<s; i++) { int a; scanf("%d", &a); bases.push_back(a); intersections.push_back({}); std::vector<int>& v = intersections.back(); v.push_back(a); if(a*2>n) { numberOfSetsToSum.push_back(a); } else { for(int j=0; j<n; j++) { int m = primes[j]*a; if(m > n) break; operations+=2; v.push_back(m); if(m==n) break; } numberOfSetsToSum.push_back(operations+n); } } int bsize = bases.size(); printf("%d\n", int(operations+numberOfSetsToSum.size()-1)); int lastSetNumber = n; for(int i=0; i<bsize; i++) { int nn = intersections[i].size(); if(nn > 1) { printNeg(intersections[i][1]); lastSetNumber++; printf("2 %d %d\n", intersections[i][0], lastSetNumber); lastSetNumber++; } for(int j=2; j<nn; j++) { printNeg(intersections[i][j]); lastSetNumber++; printf("2 %d %d\n", lastSetNumber-1, lastSetNumber); lastSetNumber++; } } if(numberOfSetsToSum.size()<=1) return 0; lastSetNumber++; printf("1 %d %d\n", numberOfSetsToSum[0], numberOfSetsToSum[1]); for(int i=2; i<numberOfSetsToSum.size(); i++) { printf("1 %d %d\n", lastSetNumber, numberOfSetsToSum[i]); lastSetNumber++; } 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include<cstdio> #include<vector> #include<math.h> int isNoPrime[50007]; void printNeg(int i) { printf("3 %d\n", i); } std::vector<unsigned> sito(int n) { std::vector<unsigned> primes{}; int m = int(std::sqrt(n)+1.0); for(int i=2; i<=m; i++) { if(isNoPrime[i]) continue; primes.push_back(i); for(int j=2*i; j<=n; j+=i) { isNoPrime[j] = true; } } for(unsigned i=m+1; i<=n; i++) { if(isNoPrime[i]) continue; primes.push_back(i); } return primes; } int main() { int n, s; scanf("%d %d", &n, &s); int operations=0; std::vector<int> bases{}; std::vector<std::vector<int>> intersections{}; std::vector<int> numberOfSetsToSum{}; const auto primes = sito(n); for(int i=0; i<s; i++) { int a; scanf("%d", &a); bases.push_back(a); intersections.push_back({}); std::vector<int>& v = intersections.back(); v.push_back(a); if(a*2>n) { numberOfSetsToSum.push_back(a); } else { for(int j=0; j<n; j++) { int m = primes[j]*a; if(m > n) break; operations+=2; v.push_back(m); if(m==n) break; } numberOfSetsToSum.push_back(operations+n); } } int bsize = bases.size(); printf("%d\n", int(operations+numberOfSetsToSum.size()-1)); int lastSetNumber = n; for(int i=0; i<bsize; i++) { int nn = intersections[i].size(); if(nn > 1) { printNeg(intersections[i][1]); lastSetNumber++; printf("2 %d %d\n", intersections[i][0], lastSetNumber); lastSetNumber++; } for(int j=2; j<nn; j++) { printNeg(intersections[i][j]); lastSetNumber++; printf("2 %d %d\n", lastSetNumber-1, lastSetNumber); lastSetNumber++; } } if(numberOfSetsToSum.size()<=1) return 0; lastSetNumber++; printf("1 %d %d\n", numberOfSetsToSum[0], numberOfSetsToSum[1]); for(int i=2; i<numberOfSetsToSum.size(); i++) { printf("1 %d %d\n", lastSetNumber, numberOfSetsToSum[i]); lastSetNumber++; } return 0; } |