結果
| 問題 |
No.747 循環小数N桁目 Hard
|
| コンテスト | |
| ユーザー |
@abcde
|
| 提出日時 | 2019-03-08 23:01:33 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 5 ms / 2,000 ms |
| コード長 | 1,834 bytes |
| コンパイル時間 | 1,550 ms |
| コンパイル使用メモリ | 160,540 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-23 15:09:43 |
| 合計ジャッジ時間 | 5,200 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 120 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main() {
// 1. 入力情報取得.
string N, K;
cin >> N >> K;
// 2. '285714' が繰り返されるので, N, K を6で割った余りを計算してみる.
int nLen = N.size(), kLen = K.size();
// 2-1. N, K の mod 2 を 確認.
int nMod2 = N[nLen - 1] % 2, kMod2 = K[kLen - 1] % 2;
// 2-2. N, K の mod 3 を 確認.
int nMod3 = 0, kMod3 = 0;
for(int i = 0; i < nLen; i++) nMod3 += (N[i] - '0');
for(int i = 0; i < kLen; i++) kMod3 += (K[i] - '0');
nMod3 %= 3, kMod3 %= 3;
// 3. N, K の mod 6 の 値に応じて, 循環小数 2/7 の 第(N の K乗)番目を 計算.
// N / K 0 1 2 3 4 5
// 0 4 4 4 4 4 4
// 1 2 2 2 2 2 2
// 2 7 8 7 8 7 8
// 3 5 5 5 5 5 5
// 4 7 7 7 7 7 7
// 5 2 1 2 1 2 1
int nMod6 = 0, kMod6 = 0;
int ans[6][6] = {
{4, 4, 4, 4, 4, 4},
{2, 2, 2, 2, 2, 2},
{7, 8, 7, 8, 7, 8},
{5, 5, 5, 5, 5, 5},
{7, 7, 7, 7, 7, 7},
{2, 1, 2, 1, 2, 1},
};
// 3-1. N mod6 を 計算.
if(nMod2 == 0 && nMod3 == 0) nMod6 = 0;
if(nMod2 == 1 && nMod3 == 1) nMod6 = 1;
if(nMod2 == 0 && nMod3 == 2) nMod6 = 2;
if(nMod2 == 1 && nMod3 == 0) nMod6 = 3;
if(nMod2 == 0 && nMod3 == 1) nMod6 = 4;
if(nMod2 == 1 && nMod3 == 2) nMod6 = 5;
// 3-2. K mod6 を 計算.
if(kMod2 == 0 && kMod3 == 0) kMod6 = 0;
if(kMod2 == 1 && kMod3 == 1) kMod6 = 1;
if(kMod2 == 0 && kMod3 == 2) kMod6 = 2;
if(kMod2 == 1 && kMod3 == 0) kMod6 = 3;
if(kMod2 == 0 && kMod3 == 1) kMod6 = 4;
if(kMod2 == 1 && kMod3 == 2) kMod6 = 5;
// 4. 出力.
cout << ans[nMod6][kMod6] << endl;
return 0;
}
@abcde