Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless committed Jul 19, 2022
1 parent 7ae6df2 commit 5b38a4a
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 1 deletion.
86 changes: 86 additions & 0 deletions 058.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# 058 - Original Calculator (★4)

## 解答

```cpp
#include <vector>
#include <iostream>
#include <algorithm> // std::find()
#include <iterator> // std::distance()

constexpr int MOD = 100000;

// 各桁の和を計算
int SumDigits(int x)
{
int result = 0;

while (x)
{
result += (x % 10);
x /= 10;
}

return result;
}

// 整数 x が表示されているときにボタン A を 1 回押したときの次の値を計算
int Next(int x)
{
return ((x + SumDigits(x)) % MOD);
}

int main()
{
// 最初に N が表示されていて, ボタンを K 回押す
int N;
long long K;
std::cin >> N >> K;

// 事前に変換テーブルを作成
std::vector<int> table(MOD);
for (int i = 0; i < MOD; ++i)
{
table[i] = Next(i);
}

// [i] を、何回ボタンを押したときに訪れるかを記録(未訪問は -1)
std::vector<int> timestamps(MOD, -1);
{
// 表示している数
int current = N;

// ボタンを押した回数
int buttonCount = 0;

// 循環を見つけたら抜ける
while (timestamps[current] == -1)
{
timestamps[current] = buttonCount;

current = table[current];

++buttonCount;
}

// 何回ボタンを押したときから循環に入るか
const int cycleStartsAt = timestamps[current];

// 見つかった循環のサイクル数
const int cycle = (buttonCount - cycleStartsAt);

if (cycleStartsAt <= K)
{
// 循環を考慮して K の値を小さくする
K = ((K - cycleStartsAt) % cycle + cycleStartsAt);
}
}

// K 回ボタンを押したときに表示されている値を調べる
const auto answer = std::distance(timestamps.begin(), std::find(timestamps.begin(), timestamps.end(), K));

// 解答を出力
std::cout << answer << '\n';
}
```
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ C++17 標準ライブラリの機能を優先して使い、競技プログラ
|[034](https://atcoder.jp/contests/typical90/tasks/typical90_ah)|[There are few types of elements](./034.md)|★4|[👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/034.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/034.cpp)|単調性を利用した尺取り法|
|[042](https://atcoder.jp/contests/typical90/tasks/typical90_ap)|[Multiple of 9](./042.md)|★4|[👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/042.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/042.cpp)|9 の倍数の性質|
|[043](https://atcoder.jp/contests/typical90/tasks/typical90_aq)|[Maze Challenge with Lack of Sleep](./043.md)|★4|[👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/043.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/043.cpp)|拡張 BFS・ダイクストラ|
|058| | | | |
|[058](https://atcoder.jp/contests/typical90/tasks/typical90_bf)|[Original Calculator](./058.md)|★4|[👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/058.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/058.cpp)|周期性を考える|
|063| | | | |
|070| | | | |
|072| | | | |
Expand Down

0 comments on commit 5b38a4a

Please sign in to comment.