結果
| 問題 |
No.1006 Share an Integer
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-02-26 21:16:26 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,888 ms / 2,000 ms |
| コード長 | 3,321 bytes |
| コンパイル時間 | 571 ms |
| コンパイル使用メモリ | 82,588 KB |
| 実行使用メモリ | 100,636 KB |
| 最終ジャッジ日時 | 2024-10-02 13:41:19 |
| 合計ジャッジ時間 | 18,516 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
class PrimeFactor():
def __init__(self, n):
"""
エラトステネス O(N loglog N)
"""
self.n = n
self.table = list(range(n+1)) # 最小素因数のリスト
self.table[2::2] = [2]*(n//2)
for p in range(3, int(n**0.5) + 2, 2):
if self.table[p] == p:
for q in range(p * p, n + 1, 2 * p):
if self.table[q] == q:
self.table[q] = p
def is_prime(self, x):
""" 素数判定 O(1) """
if x < 2:
return False
return self.table[x] == x
def prime_factors(self, x):
""" 素因数分解 O(logN) (試し割りだとO(sqrt(N))) """
res = []
if x < 2:
return res
while self.table[x] != 1:
res.append(self.table[x])
x //= self.table[x]
return res
def divisors(self, x):
""" 約数列挙 x=[1,10**6]の約数全列挙も間に合う """
primes=self.prime_counter(x)
P=set([1])
for key, value in primes.items():
Q=[]
for p in P:
for k in range(value+1):
Q.append(p*pow(key,k))
P|=set(Q)
P = list(P)
P.sort()
return P
def prime_counter(self, x):
"""
素因数分解(個数のリスト) O(logN)
{素因数: 個数} の形で返す
"""
res = dict()
if x < 2:
return res
while self.table[x] != 1:
res[self.table[x]] = res.get(self.table[x], 0) + 1
x //= self.table[x]
return res
def divisors_counter(self, x):
""" 約数の個数 O((logN)^2) """
res = 1
for value in self.prime_counter(x).values():
res *= (value+1)
return res
def prime_gcd(self, X, mod=None):
""" n個の最大公約数 X:n個のリスト (O((logN)^2)) """
exponents = self.prime_counter(X[0])
for x in X[1:]:
Y = self.prime_counter(x)
for prime, exp in exponents.items():
if Y[prime] < exp:
exponents[prime] = Y[prime]
res = 1
for prime, exp in exponents.items():
res *= pow(prime, exp, mod)
if mod == None:
return res
else:
return res % mod
def prime_lcm(self, X, mod=None):
""" n個の最小公倍数 X:n個のリスト (O((logN)^2)) """
exponents = dict()
for x in X:
for prime, exp in self.prime_counter(x).items():
if exp > exponents.get(prime, 0):
exponents[prime] = exp
res = 1
for prime, exp in exponents.items():
res *= pow(prime, exp, mod)
if mod == None:
return res
else:
return res % mod
def f(x):
return x-PF.divisors_counter(x)
#####################################################################################################
import sys
input = sys.stdin.readline
X = int(input())
PF = PrimeFactor(X)
tmp=float("inf")
res=[]
for x in range(1,X):
d=abs(f(x)-f(X-x))
if d<tmp:
tmp=d
res=[(x,X-x)]
elif d==tmp:
res.append((x,X-x))
for a,b in res:
print(a,b)