結果
| 問題 | No.3651 K-th Sum of Divisors |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-19 17:15:06 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 70 ms / 2,000 ms |
| + 171µs | |
| コード長 | 1,817 bytes |
| 記録 | |
| コンパイル時間 | 245 ms |
| コンパイル使用メモリ | 96,492 KB |
| 実行使用メモリ | 83,328 KB |
| 最終ジャッジ日時 | 2026-08-28 20:50:30 |
| 合計ジャッジ時間 | 6,794 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 55 |
ソースコード
import sys
def get_divisors_sum(x):
"""x の約数の和を返す"""
if x == 0:
return 0
total = 0
i = 1
while i * i <= x:
if x % i == 0:
total += i
if i * i != x:
total += x // i
i += 1
return total
def solve():
# 入力の受け取り
input_data = sys.stdin.read().split()
if not input_data:
return
N = int(input_data[0])
K = int(input_data[1])
MOD = 100003
# K=1 の場合は初期値 N がそのまま答え
if K == 1:
print(N)
return
# 登場した値を記録する辞書(値 -> 最初に出現したインデックス i)
# A_1 = N を記録
visited = {N: 1}
# 数列を順にシミュレーションするための配列
history = [0, N] # 1-indexed にするため先頭に 0 を入れる
current_val = N
for i in range(1, K):
# 次の項を計算
next_val = get_divisors_sum(current_val) % MOD
current_idx = i + 1
# K 番目の項に達したら終了
if current_idx == K:
print(next_val)
return
# すでに登場した値(ループ検出)
if next_val in visited:
prev_idx = visited[next_val]
cycle_len = current_idx - prev_idx
# 残りの移動回数
rem_steps = K - current_idx
# 周期で割った余り分だけ進める
ans_idx = prev_idx + (rem_steps % cycle_len)
print(history[ans_idx])
return
# 記録して次へ
visited[next_val] = current_idx
history.append(next_val)
current_val = next_val
if __name__ == '__main__':
solve()