結果
| 問題 |
No.1666 累乗数
|
| コンテスト | |
| ユーザー |
ygd.
|
| 提出日時 | 2021-09-04 10:34:52 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,169 bytes |
| コンパイル時間 | 310 ms |
| コンパイル使用メモリ | 82,460 KB |
| 実行使用メモリ | 90,704 KB |
| 最終ジャッジ日時 | 2024-12-17 17:53:15 |
| 合計ジャッジ時間 | 63,685 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | TLE * 1 |
| other | TLE * 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以下の累乗数の個数がk個以上あるか判定
cnt = [0]*60 #i乗と書けるものの個数。
for i in reversed(range(2,60)):
#同じ値でもiが大きいほうでカウント。
#小さいほうでカウントする約数でみないといけない。
#大きいほうに寄せると、倍数でみることができる。
ok = 0
ng = pow(10,18) + 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.