結果
| 問題 | No.1666 累乗数 |
| コンテスト | |
| ユーザー |
ygd.
|
| 提出日時 | 2021-09-04 10:36:44 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 1,829 ms / 2,000 ms |
| コード長 | 1,161 bytes |
| 記録 | |
| コンパイル時間 | 230 ms |
| コンパイル使用メモリ | 85,304 KB |
| 実行使用メモリ | 82,260 KB |
| 最終ジャッジ日時 | 2026-05-26 21:24:43 |
| 合計ジャッジ時間 | 33,393 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 19 |
ソースコード
import sys
input = sys.stdin.readline
import math
def main():
T = int(input())
for _ in range(T):
k = int(input())
ng = 0
ok = pow(10,18) + 10
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if check(mid) >= k:
ok = mid
else:
ng = mid
print(ok)
def check(n): #n以下の累乗数の個数
cnt = [0]*60 #i乗と書けるものの個数。
for i in reversed(range(2,60)):
#同じ値でもiが大きいほうでカウント。
#小さいほうでカウントする約数でみないといけない。
#大きいほうに寄せると、倍数でみることができる。
ok = 0
ng = math.ceil(pow(10,18) ** (1/i) + 10)
while abs(ok - ng) > 1:
mid = (ok+ng) // 2
if pow(mid,i) <= n:
ok = mid
else:
ng = mid
ok -= 1 #1を除く
cnt[i] = ok - sum(cnt[::i]) #iの倍数は全て上でそこでカウントされている。
return sum(cnt) + 1 #除かれた1を足す
if __name__ == "__main__":
main()
ygd.