描述 Description
对于一个素数 P,我们可以用一系列有理分数 (分子、分母都是不大于 N 的自然数) 来逼近 sqrt(p),例如 P=2,N=5 的时候:1/1<5/4<4/3
输出格式 OutputFormat
输出文件只有一行,格式为“X/Y U/V”。注意,答案必须是既约的,也就是说分子、分母的最大公约数必须等于 1。
样例输入 SampleInput
29009 20000
样例输出 SampleOutput
4258/25 17543/103
代码 Code
注意比较大小的时候要用 long double。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int i,j,t,n,m,p,k,u,v,z,y,x;
long double a,b,l,r;
int gcd(int a,int b)
{
if (b==0) return a;
else return gcd(b,a%b);
}
int main()
{
scanf("%d%d",&p,&n);
a=0;b=27110000.00;
for (k=1;k<=n;k++)
{
m=(int)sqrt(k*k/p)+1;
t=gcd(k,m);
l=(double)k/m;
if (l<=sqrt(p) && l>a)
{
a=l;
x=k/t;
y=m/t;
}
t=gcd(k,m-1);
r=(double)k/(m-1);
if (r>=sqrt(p) && r<b)
{
b=r;
u=k/t;
v=(m-1)/t;
}
}
printf("%d/%d %d/%d\n",x,y,u,v);
return 0;
}