Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <cstdio>
- #include <iomanip>
- #include <sstream>
- #include <cstring>
- #include <string>
- #include <cmath>
- #include <stack>
- #include <list>
- #include <queue>
- #include <deque>
- #include <set>
- #include <map>
- #include <vector>
- #include <algorithm>
- #include <numeric>
- #include <utility>
- #include <functional>
- #include <limits>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef unsigned int ui;
- const double pi = acos(-1.0);
- #define oned(a, x1, x2) { cout << #a << ":"; for(int _i = (x1); _i < (x2); _i++){ cout << " " << a[_i]; } cout << endl; }
- #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; } }
- #define mp(x, y) make_pair(x, y)
- int n;
- const ll mx = 1000*1000*1000, lim = floor(sqrt(mx));
- vector<int> prime(lim+1, true), primes;
- vector<vector<pair<int, int> > > parts;
- vector<pair<int,int> > p;
- vector<int> res;
- bool isPrime(int k) {
- if(k <= lim) {
- return prime[k];
- } else {
- for(size_t i = 0; i < primes.size(); i++) {
- if(k % primes[i] == 0) {
- return false;
- }
- }
- for(int i = lim; i*i <= k; i++) {
- if(k % i == 0) {
- return false;
- }
- }
- return true;
- }
- }
- void get(int sum, int num, int next) {
- if(sum == 1) {
- res.push_back(num);
- } else {
- for(; next < (int)p.size(); next++) {
- if(sum % p[next].first == 0 && __gcd(num, p[next].second) == 1) {
- get(sum / p[next].first, num * p[next].second, next+1);
- }
- }
- if(sum > lim && isPrime(sum-1)) {
- res.push_back(num*(sum-1));
- }
- }
- }
- void solve() {
- p = vector<pair<int,int> >();
- for(size_t i = 0; i < parts.size(); i++) {
- for(size_t j = 0; j < parts[i].size(); j++) {
- if(n % parts[i][j].first == 0) {
- p.push_back(parts[i][j]);
- }
- }
- }
- sort(p.begin(), p.end());
- res = vector<int>();
- get(n, 1, 0);
- if(res.empty()) {
- cout << -1 << endl;
- } else {
- sort(res.begin(), res.end());
- for(size_t i = 0; i < res.size(); i++) {
- cout << res[i] << ' ';
- }
- cout << endl;
- }
- }
- int main() {
- for(int i = 2; i*i <= lim; i++) {
- if(prime[i]) {
- for(int j = i*i; j <= lim; j += i) {
- prime[j] = false;
- }
- }
- }
- parts = vector<vector<pair<int,int> > >(); parts.reserve(lim);
- for(int i = 2; i <= lim; i++) {
- vector<pair<int,int> > newParts;
- if(prime[i]) {
- primes.push_back(i);
- ll part = 1, p = i;
- while(part + p <= mx) {
- part += p;
- newParts.push_back(mp(part, p));
- p *= i;
- }
- }
- parts.push_back(newParts);
- }
- // freopen("input.in", "r", stdin);
- int T; cin >> T;
- for(int t = 0; t < T; t++) {
- cin >> n;
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement