結果
問題 |
No.3236 累乗数大好きbot
|
ユーザー |
![]() |
提出日時 | 2025-08-30 17:42:31 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 556 ms / 4,000 ms |
コード長 | 1,078 bytes |
コンパイル時間 | 963 ms |
コンパイル使用メモリ | 101,888 KB |
実行使用メモリ | 6,272 KB |
最終ジャッジ日時 | 2025-08-30 17:42:48 |
合計ジャッジ時間 | 17,277 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 31 |
ソースコード
#include<iostream> #include<cassert> #include<cmath> constexpr unsigned long long kth_root(unsigned long long a,unsigned long long k){ if(a<=1||k==1)return a; if(k>=64)return 1; if(k==2)return sqrtl(a); if(a==-1)a--; unsigned long long res=(k==3?cbrt(a):pow(a,(long double)1/k))-1; while(true){ unsigned long long p=k,prod=1,b=res+1; while(p>0){ if(p&1){ if(b==-1){ prod=-1ull; break; } if(prod<=(-1ull)/b)prod*=b; else{ prod=-1ull; break; } } if(b<(1ull<<32))b*=b; else b=-1ull; p>>=1; } if(prod>a)break; else res++; } return res; } using namespace std; using ll=long long; ll ipow(ll a,ll b){ ll res=1; while(b){ if(b&1)res*=a; a*=a; b>>=1; } return res; } int main(){ int t; cin>>t; while(t--){ ll n; cin>>n; int ans=-1; for(int i=60;i>=1;i--){ ll a=kth_root(n,i); if(ipow(a,i)==n){ ans=i; break; } } assert(ans!=-1); cout<<ans<<'\n'; } }