zoukankan      html  css  js  c++  java
  • 分数拆分

    分数拆分(split.???)

    问题描述:
    输入正整数 k,找到所有的正整数对(x,y),使得:1/k = 1/x + 1/y,且 x>=y。输出有
    多少组满足要求的 x、y。
    输入格式:
    输入只有一个正整数 k。
    输出格式:
    输出一行一个整数,表示解的组数。
    输入样例:
    2
    输出样例:
    2
    样例解释:
    只有如下两组满足题意的解:
    1/2=1/6+1/3
    1/2=1/4+1/4
    数据限制:
    50%的数据满足:2<=k<=1000;
    100%的数据满足:2<=k<=30000。

    分析
    其实这题运用一下数学思想就能优化许多
    纯粹的枚举肯定是 徒劳无功的
    1/n=1/x+1/y=(x+y)/xy 所以xy=n(x+y) =====> y=nx/(x-n)
    而x枚举的范围 很容易知道 在n+1到2n n+1是因为它的倒数小于1/n 到2n是因为 枚举的最后一个肯定是1/2n+1/2n这个结果 当x比2n大的时候 实际上就跟前面的枚举重复了。
    x在n+1到2n的范围 ,再判断y=nx/(x-n) 这个是不是整数就好了。 一层循环就解决了。
    判断是否为整数可以用截尾函数或者四舍五入函数与 原数进行比较,若相同则为整数。

    程序:

    var
    k,ans,i:longint;
    begin
        assign(input,'split.in');
        reset(input);
        assign(output,'split.out');
        rewrite(output);
        readln(k);
        ans:=0;
        for i:=k+1 to 2*k do
        if trunc(k*i/(i-k))=k*i/(i-k) then inc(ans);
        write(ans);
        close(input);
        close(output);
    end.
    
    
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500073.html
Copyright © 2011-2022 走看看