hdu 2225 求分母不超过m的最接近sqrt(n)的分数

来源:互联网 发布:nfc手机支付软件 编辑:程序博客网 时间:2024/04/28 13:55

思路:
sqrt(n)=sqrt(i*i*n)/i
所以这个以i为分母的分子一定是【sqrt(i*i*n)】或【sqrt(i*i*n)】+1。所以遍历所以i找到那个最接近的分数。
这里比较两个分数谁更接近sqrt(n)时,将sqrt(n)平方,然后通分,比较分子即可。

#include<bits/stdc++.h>using namespace std;#define mod 1000000007#define PI acos(-1.0)#define INF 0x3f3f3f3ftypedef long long LL;typedef unsigned long long ULL;LL N,M;LL x,y;LL gcd(LL a,LL b){    return b==0?a:gcd(b,a%b);}int main(){    while(~scanf("%lld%lld",&N,&M)){    x=y=1;    for(LL i=1;i<=M;i++){        LL t=(LL)sqrt(i*i*N);        for(LL d=0;d<=1;d++){            if(abs((t+d)*(t+d)*y*y-i*i*y*y*N)<abs(x*x*i*i-i*i*y*y*N)){                y=i;                x=t+d;            }        }    }    LL g=gcd(x,y);    printf("%lld/%lld\n",x/g,y/g);}    return 0;}
0 0
原创粉丝点击