https://www.acmicpc.net/problem/6064
6064번: 카잉 달력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다.
www.acmicpc.net
[난이도] Silver1
[유형] 수학
[풀이]
문제를 풀어서 해석해보면 결국
M*a+x == N*b+y를 만족하는 a,b가 있는지를 찾는 문제입니다..
M*a == N*b가 되면 종말이며, 이때 M*a,N*b는 M,N의 최소공배수입니다..
즉, a는 lcm(M,N)/M 이상이 될수 없고, b는 lcm(M,N)/N 이상이 될 수 없습니다..
코드상에서 보면 a를 curM 변수, b를 curN 변수로 놓고
curM*M+x == curN*N+y을 만족할때까지
curM,curN을 하나씩 증가시키면서 루프를 돌리면 됩니다.
#include <cstdio>
#include <algorithm>
using namespace std;
int tc,M,N,x,y;
int gcd(int a,int b){
if(a>b) swap(a,b);
while(a!=0){
int c = b%a;
b=a;
a=c;
}
return b;
}
int sol(){
int lcm = (M*N)/gcd(M,N);
int mxM = lcm/M, mxN = lcm/N;
int curM=0,curN=0;
while(curM<mxM&&curN<mxN){
int l = curM*M+x;
int r = curN*N+y;
if(l==r) return l;
if(l>r) curN++;
else curM++;
}
return -1;
}
int main(){
scanf("%d",&tc);
while(tc--){
scanf("%d%d%d%d",&M,&N,&x,&y);
printf("%d\n",sol());
}
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Silver1/6064.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Silver1] 11286 : 절댓값 (Kotlin) (0) | 2021.07.25 |
---|---|
[BOJ/백준][Silver3] 9375 : 패션왕 신해빈 (Kotlin) (0) | 2021.07.18 |
[BOJ/백준][Silver2] 5525 : IOIOI (C++) (0) | 2021.07.18 |
[BOJ/백준][Silver1] 1927 : 최소 힙 (Kotlin) (0) | 2021.07.18 |
[BOJ/백준][Silver4] 1764 : 듣보잡 (Kotlin) (0) | 2021.07.18 |