結果
問題 |
No.3301 Make Right Triangle
|
ユーザー |
|
提出日時 | 2025-10-05 14:30:00 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 482 ms / 2,000 ms |
コード長 | 2,744 bytes |
コンパイル時間 | 2,073 ms |
コンパイル使用メモリ | 205,416 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-10-05 14:30:36 |
合計ジャッジ時間 | 10,371 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 9 |
ソースコード
#include<bits/stdc++.h> using namespace std; bool MillerRabin(long long n,vector<long long> A){ long long D,s,t,d,x; uint64_t mod=n,imod=n,t128=-__uint128_t(n)%n,m1; s=__builtin_ctzll(n-1); D=n-1>>s; for(int i=0;i<5;i++) imod*=2-mod*imod; imod=-imod; m1=(t128+__uint128_t(t128*imod)*mod)>>64; if(m1>=n) m1-=n; for(auto a:A){ if(n<=a) return true; a=(__uint128_t(a)*t128+__uint128_t(a*t128*imod)*mod)>>64; if(a>=mod) a-=mod; x=m1; for(d=D;d>0;d>>=1){ if(d&1){ x=(__uint128_t(a)*x+__uint128_t(a*x*imod)*mod)>>64; if(x>=mod) x-=mod; } a=(__uint128_t(a)*a+__uint128_t(a*a*imod)*mod)>>64; if(a>=mod) a-=mod; } if(x!=m1){ for(t=0;t<s;t++){ if(x==mod-m1) break; x=(__uint128_t(x)*x+__uint128_t(x*x*imod)*mod)>>64; if(x>=mod) x-=mod; } if(t==s) return false; } } return true; } bool IsPrime(long long n){ if(n<=1) return false; else if(n==2) return true; else if(n%2==0) return false; else if(n<4759123141LL) return MillerRabin(n,{2,7,61}); else return MillerRabin(n,{2,325,9375,28178,450775,9780504,1795265022}); } long long FindPrimeFactor(long long n){ if(n%2==0) return 2; uint64_t mod=n,imod=n; for(int i=0;i<5;i++) imod*=2-mod*imod; imod=-imod; long long m=pow(n,0.15)+1,y,g,q,r,k,x,ys,d,c=1; auto f=[&](long long v){ v=(__uint128_t(v)*v+__uint128_t(v*v*imod)*mod)>>64; if(v>=mod) v-=mod; v+=c; if(v>=mod) v-=mod; return v; }; for(;true;c++){ y=k=0; g=r=1; for(;g==1;){ x=y; for(;4*k<3*r;k++) y=f(y); for(;k<r&&g==1;){ ys=y; q=1; for(int i=0;i<min(m,r-k);i++){ y=f(y); d=x>y?x-y:y-x; q=(__uint128_t(q)*d+__uint128_t(q*d*imod)*mod)>>64; if(q>=mod) q-=mod; } g=gcd(q,n); k+=m; } k=r; r*=2; } if(g==n){ g=1; y=ys; for(;g==1;){ y=f(y); g=gcd(x>y?x-y:y-x,n); } } if(g==n) continue; else if(IsPrime(g)) return g; else if(IsPrime(n/g)) return n/g; else return FindPrimeFactor(g); } } vector<long long> Factorize(long long n){ vector<long long> ret; long long p; for(;!IsPrime(n)&&n>1;){ p=FindPrimeFactor(n); for(;n%p==0;){ n/=p; ret.push_back(p); } } if(n>1) ret.push_back(n); sort(ret.begin(),ret.end()); return ret; } void solve(){ long long l; cin>>l; auto F=Factorize(l); long long p=F.back(); if(p==2){ long long r=l/4; cout<<r*3<<" "<<r*4<<" "<<r*5<<endl; return; } long long r=l/p; cout<<r*p<<" "<<r*(p*p-1)/2<<" "<<r*(p*p+1)/2<<endl; } int main(){ int t; cin>>t; while(t--) solve(); }