// g++ 1.cpp -std=c++17 -O2 -I . #include using namespace std; using ll = long long; using ld = long double; using vi = vector; using vvi = vector; using vll = vector; using vvll = vector; using vld = vector; using vvld = vector; using vst = vector; using vvst = vector; #define fi first #define se second #define pb push_back #define eb emplace_back #define pq_big(T) priority_queue,less> #define pq_small(T) priority_queue,greater> #define all(a) a.begin(),a.end() #define rep(i,start,end) for(ll i=start;i<(ll)(end);i++) #define per(i,start,end) for(ll i=start;i>=(ll)(end);i--) #define uniq(a) sort(all(a));a.erase(unique(all(a)),a.end()) //https://atcoder.jp/contests/arc122/submissions/24436348 //https://judge.yosupo.jp/submission/53811 //https://yukicoder.me/submissions/680896 //https://atcoder.jp/contests/abc180/submissions/24436784 #include #include #include #include #include #include std::mt19937_64 mt{std::random_device{}()}; long long rnd(long long n) { return std::uniform_int_distribution(0, n-1)(mt); } bool is_prime(long long x){ using u128=__uint128_t; if(x==2||x==3||x==5||x==7)return true; if(x%2==0||x%3==0||x%5==0||x%7==0)return false; if(x<121){ return x>1; } long long d = (x-1) >> __builtin_ctzll(x-1); long long one=1,minus_one=x-1; auto pow = [](long long x,long long n,long long mod){ u128 res; x%=mod; if(n==0){ res=1;return res; } res=1; u128 now=x; for(;n;n>>=1,now=(now*now)%mod){ if(n&1){ res=res*now%mod; } } return res; }; auto ok = [&](long long a){ auto y=pow(a,d,x); long long t=d; while(y!=one&&y!=minus_one&&t!=x-1){ y=y*y%x; t<<=1; } if(y!=minus_one&&t%2==0)return false; return true; }; if(x<(1ull<<32)){ for(long long a:{2,7,61}){ if(!ok(a))return false; } } else{ for(long long a:{2,325,9375,28178,450775,9780504,1795265022}){ if(x<=a)return true; if(!ok(a))return false; } } return true; } long long GCD(long long a,long long b){ if(b==0){ return a; } else{ return GCD(b,(a%b)); } } long long rho(long long n,long long c){ using u128=__uint128_t; assert(n>1); long long cc=c; auto f = [&](long long x){ long long res; res=(((u128)x)*x+cc)%n; return res; }; long long x=1,y=2,z=1,q=1; long long g=1; long long m= 1LL<<((64-__builtin_ctzll(n))/5); for(long long r=1;g==1;r<<=1){ x=y; for(int i=0;i1); if(is_prime(n)) return n; for(int i=0;i<100;i++){ long long m=rho(n,rnd(n)); if(is_prime(m))return m; n=m; } std::cerr<<"failed\n"; assert(false); return -1; } //nを素因数分解 {素因数,個数} で管理 (1は空配列) std::vector> factor(long long n){ static std::vector> res; res.clear(); for(long long i=2;i<=100&&i*i<=n;++i){ if(n%i==0){ int cnt=0; do{ cnt++; n/=i; }while(n%i==0); res.emplace_back(i,cnt); } } while(n>1){ long long p=prime_factor(n); int cnt=0; do{ cnt++; n/=p; }while(n%p==0); res.emplace_back(p,cnt); } std::sort(res.begin(),res.end()); return res; } //nの約数配列(昇順) 引数はfactor(n) std::vector divisor(std::vector> &fac){ int sz=fac.size(); //n=1の時 if(sz==0){ return {1}; } std::vector> x(sz); for(int i=0;i> res(sz); res[0]=x[0]; for(int i=1;i>n; // x <= y <= z // yz + xy + xz = n // (y+x)(z+x) = n + x^2 vector> v; rep(i,0,5000){ if(i*i>n)break; auto f=factor(n+i*i); auto d=divisor(f); for(ll d2:d){ ll d3=(n+i*i)/d2; ll y=d2-i,z=d3-i; if(i<=y&&y<=z){ v.emplace_back(i,y,z); } } } vector> ans; for(auto [x,y,z]:v){ ans.emplace_back(x,y,z); ans.emplace_back(x,z,y); ans.emplace_back(y,x,z); ans.emplace_back(y,z,x); ans.emplace_back(z,x,y); ans.emplace_back(z,y,x); } uniq(ans); cout<