結果
| 問題 |
No.2954 Calculation of Exponentiation
|
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2024-11-10 02:04:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,540 bytes |
| コンパイル時間 | 2,041 ms |
| コンパイル使用メモリ | 196,428 KB |
| 最終ジャッジ日時 | 2025-02-25 03:24:59 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 WA * 1 |
ソースコード
#include <bits/stdc++.h>
//#include <atcoder/modint>
using namespace std;
//using namespace atcoder;
using ll = long long;
//using mint = modint998244353;
const ll inf=9e18;
ll ipow(ll a, ll b){
ll res=1;
for (int i=0; i<b; i++){
if (res >= inf/a+1) return -1;
res *= a;
}
return res;
}
ll isqrt(ll a, ll b=2){
ll l=1, r=a+1, c, p;
while(r-l>1){
c = (l+r)/2;
p = ipow(c, b);
if (p != -1 && p <= a) l=c;
else r=c;
}
return l;
}
int main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
/*
Aが1、またはBが0のとき整数
B<0のとき、Aの逆数を取る。
A*z = 1
A*z = 10^8
Aの逆数は整数でないといけないので整数部分が0でない場合は除外
Bは小数部分のみを考えれば良い。
そうでない時、Aは整数でないといけない
Aが整数のとき、
Bとしてありうるものは1/(2^a*5^b)と表せるもの
B*10^4 = 2^(4-a) * 5^(4-b)
からa, bが求まる。
Aはある整数xを用いてx^(2^a+5^b)と表される。
*/
string AA, BB;
cin >> AA >> BB;
if (BB == "0.0000" || AA == "1.0000"){
cout << "Yes" << endl;
return 0;
}
ll A, B, a=-1, b=-1, x;
if (BB[0] != '-'){
if (AA.substr(AA.size()-4, 4) != "0000"){
cout << "No" << endl;
return 0;
}
A = stoll(AA.substr(0, AA.size()-5));
B = stoll(BB.substr(BB.size()-4, 4));
}
else{
A = stoll(AA.substr(0, AA.size()-5));
if (A != 0){
cout << "No" << endl;
return 0;
}
x = stoll(AA.substr(AA.size()-4, 4));
if (10000LL % x != 0){
cout << "No" << endl;
return 0;
}
A = 10000LL / x;
B = stoll(BB.substr(BB.size()-4, 4));
}
if (B == 0){
cout << "Yes" << endl;
return 0;
}
for (int i=0; i<=4; i++){
for (int j=0; j<=4; j++){
x = 1;
for (int k=0; k<i; k++) x *= 2;
for (int k=0; k<j; k++) x *= 5;
if (x == B){
a = 4-i;
b = 4-j;
}
}
}
if (a == -1){
cout << "No" << endl;
return 0;
}
x = 1;
for (int i=0; i<a; i++) x *= 2;
for (int i=0; i<b; i++) x *= 5;
ll y = isqrt(A, x);
cout << (ipow(y, x) == A ? "Yes" : "No") << endl;
return 0;
}
srjywrdnprkt