베주의 항등식 - 최대공약수로 만들 수 있는 정수
1. 문제
25333번: 개구리
Albert는 개구리 장난감을 이용한 놀이를 즐겨한다. 이 장난감은 우측으로 $A$cm 혹은 좌측으로 $B$cm 점프할 수 있다. 예를 들어 현재 개구리 장난감의 위치가 $0$이고 $A = 4$, $B = 2$ 라 하자. 아래 그
www.acmicpc.net
2. 풀이
예제를 보면 A,B의 최대공약수의 배수의 개수가 정답일 것 같은데
조금 수학적으로 생각해보면
A,B로 만들 수 있는 자연수가 X 이내에 몇개나 있느냐?라는 문제와 같은데
오른쪽으로 x번 A만큼 점프하면 Ax가 되고 왼쪽으로 y번 B만큼 점프하면 By가 되니까, 만들 수 있는 정수는
Ax+By형태와 같다.
이는 베주의 항등식 형태와 같으며,
"정수 x,y에 대하여 ax+by의 형태로 표현되는 모든 정수는 gcd(a,b)의 배수와 같다"
귀찮아서 증명하진 않았네..?
https://deepdata.tistory.com/577
모듈로 연산에서 나눗셈을 하는 방법(모듈로 곱셈의 역원 구하기)
1. 합동식에서 기본적으로 알아야하는 성질 1-1) 양변에 어떤 정수에 대한 덧셈이나 뺄셈을 하더라도 상관없다. $a \equiv b (mod p)$이고 $c \equiv d (mod p)$이면, $$a \pm c \equiv b \pm d (mod p)$$ 그러므로, c = d
deepdata.tistory.com
따라서, a,b의 최대공약수를 구하고 x 이내에 최대공약수의 배수가 몇개나 있는지 구하면 된다.
1부터 x까지 c의 배수의 개수는 x//c라는건 알고 있겠지..?
from sys import stdin
def gcd(a,b):
while b != 0:
a,b = b,a%b
return a
T = int(stdin.readline())
for _ in range(T):
a,b,x = map(int,stdin.readline().split())
gcd_ab = gcd(a,b)
print(x//gcd_ab)
'정수론' 카테고리의 다른 글
1부터 n까지 모든 자연수들 각각의 약수의 누적합을 구하는 방법들(double counting, harmonic lemma, dynamic programming) (0) | 2023.06.15 |
---|---|
최대공약수의 약수는 모든 수들의 공약수이고 최소공배수의 배수는 모든 수들의 배수이다 (0) | 2023.05.28 |
피보나치 수열 심화과정5 -피보나치 수열의 합을 가장 빠르게 구하는 방법- (0) | 2023.05.27 |
피보나치 수열 심화과정4 -피보나치 수의 최대공약수 놀라운 성질- (0) | 2023.05.26 |
피보나치 수열 심화과정3 -모든 자연수는 피보나치 수의 합으로 유일하게 분해할 수 있다(제켄도르프의 정리)- (0) | 2023.05.23 |