結果
| 問題 |
No.577 Prime Powerful Numbers
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-06-16 19:33:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,546 bytes |
| コンパイル時間 | 259 ms |
| コンパイル使用メモリ | 82,500 KB |
| 実行使用メモリ | 160,128 KB |
| 最終ジャッジ日時 | 2024-12-31 04:50:21 |
| 合計ジャッジ時間 | 26,002 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 3 TLE * 7 |
ソースコード
import sys
input = lambda : sys.stdin.readline().rstrip()
sys.setrecursionlimit(2*10**5+10)
write = lambda x: sys.stdout.write(x+"\n")
debug = lambda x: sys.stderr.write(x+"\n")
writef = lambda x: print("{:.12f}".format(x))
def hurui(n):
"""線形篩
pl: 素数のリスト
mpf: iを割り切る最小の素因数
"""
pl = []
mpf = [None]*(n+1)
for d in range(2,n+1):
if mpf[d] is None:
mpf[d] = d
pl.append(d)
for p in pl:
if p*d>n or p>mpf[d]:
break
mpf[p*d] = p
return pl, mpf
from collections import defaultdict
def factor(num):
d = defaultdict(int)
if num==1:
d.update({1:1})
return d
while num>1:
d[mpf[num]] += 1
num //= mpf[num]
return d
def inv_pow(v,b):
"""x**b == v なるxが存在すればそれを返す
存在しない場合、Noneを返す
"""
assert v>=0
if v==0:
return 0
l = 0
r = v+1
while r-l>1:
m = (r+l)//2
p = pow(m,b)
if p>v:
r = m
elif p<v:
l = m
else:
return m
return None
def sub0(n):
for i in range(m):
p = pl[i]
for j in range(m):
q = pl[j]
pp = p
for a in range(1,100):
if pp>n:
break
qq = q
for b in range(1,100):
if qq>n:
break
if pp+qq==n:
print("Yes")
# print(p,q,a,b)
return
qq *= q
# print(pp,qq)
pp *= p
print("No")
def sub1(n):
if n%2==0:
print("Yes")
else:
pp = 2
for a in range(1,100):
if pp>n:
print("No")
return
v = n - pp
# print(v)
for b in range(1,100):
val = inv_pow(v, b)
if val is not None:
# print(val)
if is_prime(int(val)):
print("Yes")
return
pp *= 2
from math import gcd
def is_prime(n):
"""miller_rabinによる素数判定
"""
l = [2,3,5,7,11,13,17,19,23,29,31,37]
if n in l:
return True
d = n-1
s = 0
while d%2==0:
s += 1
d //= 2
for a in l:
v = pow(a,d,n)
if v==1 or v==n-1:
continue
for _ in range(s):
v = v*v % n
if v==n-1:
break
else:
return False
return True
def rho(n):
"""nの素数判定
素数のとき0, 合成数の時見つかった約数を返す
"""
x = y = 2
g = 1
i = 0
while g==1:
x = (x*x + 1) % n
y = (y*y + 1) % n
y = (y*y + 1) % n
g = gcd((x-y), n)
i += 1
if g==n:
return 0, i
elif g>1:
return g
def factor_fast(n):
"""高速な素因数分解
"""
f = is_prime(n)
if f:
return {n:1}
ans = {}
v = rho(n)
while v!=0:
ans.setdefault(v, 0)
while n%v==0:
n //= v
ans[v] += 1
if n>10**12 and is_prime(n):
return ans
v = rho(n)
q = int(input())
pl, mpf = hurui(5000)
m = len(pl)
for i in range(q):
n = int(input())
if n<50:
sub0(n)
else:
sub1(n)