マスター・オブ・整数で競技プログラミング その3 つづき
問題
解説
と書き直すとは互いに素。また,。これらをに代入して整理すると
ここでの素因数分解を考える。
#Nの約数を取得 def make_divisors(n): for i in range(1, int(n**0.5)+1): if n % i == 0: divisors.append(i) if i != n // i: divisors.append(n//i) divisors.sort() #平方数かどうか def isSquare(n): if n < 0: return False if (n**0.5).is_integer(): return True else: return False #最大公約数を取得 def gcd(a,b): if b == 0: return a return gcd(b,a%b) #互いに素かどうか def isCoPrime(a,b): if gcd(a,b) == 1: return True else: return False N = int(input()) N0 = N divisors = [] make_divisors(N) #Nが素数の場合 if len(divisors) == 2: print("No ans") exit() for g in divisors: N = N0 if not g**2 in divisors: continue else: N //= (g**2) for d in divisors: d /= g**2 dd = N//d if 1 in (d,dd): continue elif d >= dd: if isSquare(d-1) and isSquare(dd-1) and isCoPrime(int(d**0.5),int(dd**0.5)): print(int(d**0.5)*g,int(dd**0.5)*g)
というコードを書いた。多分正しいと思うが,のケース以外を確認できていない。