BOJ-10253 헨리
접근
-
방정식과 시간복잡도에 대한 고려를 해야하는 문제였다.
-
먼저 헨리식 표현법의 첫번째 수를 구하는 방법은 아래와 같다.
-
을 만족하는 최대의 은
b
와a
의 값은 알고있으므로 에 2부터 값을 대입하여 쭉 올라가면 정답을 찾을 수 있을 것이다. 하지만 이는 시간초과를 받게된다. -
따라서 2부터 값을 대입하는 부분을 에서 로 줄여야했다.
-
식을 정리하여 이렇게 나타내면 만에 을 알 수 있고,
a
가b
의 배수가 아닌경우를 고려하여 값에 +1을 해주어야한다. -
을 구한후
a
,b
에 각각 값을 갱신해주고a
가 1이 될때 까지 반복하면 된다. -
라는 식을 구하고 통분을 하면 라는 식을 얻을 수 있고, , 을 대입하여 과정을 반복한다.
-
이때
a
와b
가 기약분수 꼴이 아닌 결과가 나올때도 있는데, 이 문제는gcd(a,b)
를 각a
,b
에 나눠주면서 해결할 수 있었다.
코드(C++)
#include <iostream>
#define FIO ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
using namespace std;
typedef long long ll;
ll t,a,b;
ll gcd(ll a,ll b){ return b ? gcd(b,a%b):a;}
int main(){
FIO;
cin>>t;
while(t--){
cin>>a>>b;
while(a!=1){
ll tmp = (b%a!=0) ? b/a+1:b/a;
a = a*tmp-b; b *= tmp;
ll res = gcd(a,b); a/=res; b/=res;
}
cout<<b<<"\n";
}
return 0;
}
결과
Author And Source
이 문제에 관하여(BOJ-10253 헨리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hschoi1104/BOJ-10253-헨리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)