結果
| 問題 |
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();
}