$O(l)$ l: 범위
분모 i를 1...32767이라 가정하자.
분수를 찾기 위해
max(1,x*i/y-1)<=j<=min(32767,x*i/y+1) 인 j/i만 봐도 충분하다.
만약 j와 i의 최대 공약수가 1보다 큰 d라면 분모가 i/d 였을 때 현재 분수가 답인지 고려되었을 것이다.
#include<cstdio> #include<algorithm> using namespace std; int x, y, u, v; double mini = 1e9; int main() { scanf("%d%d", &x, &y); for (int i = 1; i <= 32767; i++) { for (int j = max(1, x*i / y - 1); j <= min(32767, x*i / y + 1); j++) { double t = abs((double)x / y - (double)j / i); if (t && mini > t) { mini = t; u = j; v = i; } } } printf("%d %d", u, v); return 0; }
댓글 없음 :
댓글 쓰기