結果
| 問題 |
No.2271 平方根の13桁精度近似計算
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-15 10:28:32 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,420 bytes |
| コンパイル時間 | 1,826 ms |
| コンパイル使用メモリ | 196,876 KB |
| 最終ジャッジ日時 | 2025-02-12 08:44:57 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 37 WA * 3 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef unsigned long long ull;
// const ll INF = numeric_limits<ll>::max() / 4;
// const int INF = numeric_limits<int>::max() / 4;
// cout << std::fixed << std::setprecision(15);
int main() {
ll N; int E;
cin >> N >> E;
int K = 20;
ll EPS = 1;
for(int i = 0; i < K; i++) EPS *= 5;
if(N < 0) N += EPS;
if(N == 0){
cout << 0 << endl;
return 0;
}
ll D = 0;
while(N % 5 == 0){
N /= 5;
D++;
}
if(D % 2 == 1){
cout << "NaN" << endl;
return 0;
}
vector<ll> T(K, 0);
for(int k = 0; k < K; k++){
T[k] = N % 5LL;
N /= 5;
}
vector<ll> R(K, 0);
vector<ll> U(K, 0);
for(int e = 0; e < E - D; e++){
ll l = U[e];
U[e] = 0;
for(int j = 1; j <= e - 1; j++){
l += R[j] * R[e - j];
}
bool f = false;
for(R[e] = 0; R[e] < 5; R[e]++){
ll s = R[e] * R[0] * 2;
if(e == 0) s = R[0] * R[0];
if((l + s) % 5 == T[e]){
l += s;
l /= 5;
for(int j = e + 1; j < K; j++){
U[j] += l % 5;
l /= 5;
}
f = true;
break;
}
}
if(!f){
cout << "NaN" << endl;
return 0;
}
}
ll r = 0;
ll d = 1;
for(int k = 0; k <= K; k++){
r += R[k] * d;
d *= 5LL;
}
for(int i = 0; i < D / 2; i++) r *= 5;
EPS = 1;
for(int i = 0; i < E; i++) EPS *= 5;
while((1LL << 29) < r) r -= EPS;
if(r < -(1LL << 29)){
cout << "NaN" << endl;
}else{
cout << r << endl;
}
return 0;
}