Advertisement
Guest User

SnarkF

a guest
Aug 14th, 2012
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdio>
  4. #include <iomanip>
  5. #include <sstream>
  6. #include <cstring>
  7. #include <string>
  8. #include <cmath>
  9. #include <stack>
  10. #include <list>
  11. #include <queue>
  12. #include <deque>
  13. #include <set>
  14. #include <map>
  15. #include <vector>
  16. #include <algorithm>
  17. #include <numeric>
  18. #include <utility>
  19. #include <functional>
  20. #include <limits>
  21. using namespace std;
  22.  
  23. typedef long long ll;
  24. typedef unsigned long long ull;
  25. typedef unsigned int ui;
  26.  
  27. const double pi = acos(-1.0);
  28.  
  29. #define oned(a, x1, x2) { cout << #a << ":"; for(int _i = (x1); _i < (x2); _i++){ cout << " " << a[_i]; } cout << endl; }
  30. #define twod(a, x1, x2, y1, y2) { cout << #a << ":" << endl; for(int _i = (x1); _i < (x2); _i++){ for(int _j = (y1); _j < (y2); _j++){ cout << (_j > y1 ? " " : "") << a[_i][_j]; } cout << endl; } }
  31. #define mp(x, y) make_pair(x, y)
  32.  
  33. int n;
  34. const ll mx = 1000*1000*1000, lim = floor(sqrt(mx));
  35. vector<int> prime(lim+1, true), primes;
  36. vector<vector<pair<int, int> > > parts;
  37. vector<pair<int,int> > p;
  38.  
  39. vector<int> res;
  40.  
  41. bool isPrime(int k) {
  42.     if(k <= lim) {
  43.         return prime[k];
  44.     } else {
  45.         for(size_t i = 0; i < primes.size(); i++) {
  46.             if(k % primes[i] == 0) {
  47.                 return false;
  48.             }
  49.         }
  50.         for(int i = lim; i*i <= k; i++) {
  51.             if(k % i == 0) {
  52.                 return false;
  53.             }
  54.         }
  55.         return true;
  56.     }
  57. }
  58.  
  59. void get(int sum, int num, int next) {
  60.     if(sum == 1) {
  61.         res.push_back(num);
  62.     } else {
  63.         for(; next < (int)p.size(); next++) {
  64.             if(sum % p[next].first == 0 && __gcd(num, p[next].second) == 1) {
  65.                 get(sum / p[next].first, num * p[next].second, next+1);
  66.             }
  67.         }
  68.        
  69.         if(sum > lim && isPrime(sum-1)) {
  70.             res.push_back(num*(sum-1));
  71.         }
  72.     }
  73. }
  74.  
  75. void solve() {
  76.     p = vector<pair<int,int> >();
  77.     for(size_t i = 0; i < parts.size(); i++) {
  78.         for(size_t j = 0; j < parts[i].size(); j++) {
  79.             if(n % parts[i][j].first == 0) {
  80.                 p.push_back(parts[i][j]);
  81.             }
  82.         }
  83.     }
  84.     sort(p.begin(), p.end());
  85.    
  86.     res = vector<int>();
  87.     get(n, 1, 0);
  88.    
  89.     if(res.empty()) {
  90.         cout << -1 << endl;
  91.     } else {
  92.         sort(res.begin(), res.end());
  93.         for(size_t i = 0; i < res.size(); i++) {
  94.             cout << res[i] << ' ';
  95.         }
  96.         cout << endl;
  97.     }
  98. }
  99.  
  100. int main() {
  101.     for(int i = 2; i*i <= lim; i++) {
  102.         if(prime[i]) {
  103.             for(int j = i*i; j <= lim; j += i) {
  104.                 prime[j] = false;
  105.             }
  106.         }
  107.     }
  108.    
  109.     parts = vector<vector<pair<int,int> > >(); parts.reserve(lim);
  110.     for(int i = 2; i <= lim; i++) {
  111.         vector<pair<int,int> > newParts;
  112.         if(prime[i]) {
  113.             primes.push_back(i);
  114.            
  115.             ll part = 1, p = i;
  116.             while(part + p <= mx) {
  117.                 part += p;
  118.                 newParts.push_back(mp(part, p));
  119.                 p *= i;
  120.             }
  121.         }
  122.         parts.push_back(newParts);
  123.     }
  124.    
  125. //  freopen("input.in", "r", stdin);
  126.     int T; cin >> T;
  127.     for(int t = 0; t < T; t++) {
  128.         cin >> n;
  129.         solve();
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement