값 n이 있다고 가정하고 방정식 a*x + b*y =n이 최소한 하나의 해를 갖도록 존재하는 쌍 (a, b) [a
따라서 입력이 n =4와 같으면 유효한 쌍이 (1, 2) 및 (1, 3)이므로 출력은 2가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- divisors_gen() 함수를 정의합니다. n 소요됩니다.
- divs :=n+1 크기의 목록 목록입니다. 그리고 각 내부 목록은 1을 보유하고 있습니다.
- divs[0] :=요소가 하나만 있는 목록 0
- 2~n 범위의 i에 대해 다음을 수행합니다.
- (n / i) + 1의 바닥까지 범위 1의 j에 대해
- 인덱스 [i * j]의 목록 끝에 i 삽입
- (n / i) + 1의 바닥까지 범위 1의 j에 대해
- div를 반환하지만 모든 내부 목록을 뒤집습니다.
- 메인 방법에서 다음을 수행하십시오. -
- 결과:=0
- d_cache :=divisors_gen(n+1)
- 1에서 n - 1까지의 범위에 대해 다음을 수행합니다.
- i :=1
- s :=새로운 세트
- a*i
- b :=n - a*i
- d_cache[b]의 각 d에 대해 다음을 수행합니다.
- d> a이면
- d가 s에 없으면
- 결과 :=결과 + 1
- d가 s에 없으면
- 그렇지 않으면
- 루프에서 나오다
- 세트 s에 d 삽입
- 나는 :=나는 + 1
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def divisors_gen(n):
divs = [[1] for x in range(0, n + 1)]
divs[0] = [0]
for i in range(2, n + 1):
for j in range(1, n // i + 1):
divs[i * j].append(i)
return [i[::-1] for i in divs]
def solve(n):
result = 0
d_cache = divisors_gen(n+1)
for a in range(1, n):
i = 1
s = set([])
while a*i < n:
b = n - a*i
for d in d_cache[b]:
if d > a:
if d not in s:
result += 1
else:
break
s.add(d)
i += 1
return result
n = 4
print(solve(n)) 입력
4
출력
2