【问题标题】:Finding a irreducible fraction寻找不可约分数
【发布时间】:2016-12-26 22:28:52
【问题描述】:

给定一个正整数n,要求从[1...n] 集合中找出两个数字AB 的概率,使得A 和@ 中的GCD 987654327@ 是B。所以我的方法是计算对的数量,使得一个可以被另一个整除。答案应该是不可约分数形式
示例:
1 2 3
输出:
1/1 3/4 5/9

long n = sc.nextLong();
long sum=0;
for(long i=1;i<=n/2;i++)
    sum+=(n/i)-1;
 long tot = n*n;
 sum+=n;
 long bro = hcf(tot,sum);
 sum/=bro;
 tot/=bro;
 System.out.print(sum+"/"+tot);

而我的hcf 函数是:

public static long hcf(long n1,long n2)
{
    if (n2!=0)
        return hcf(n2, n1%n2);
    else 
        return n1;
}

但是编译器消息超时。我认为hcf 函数可能存在一些问题,或者有更好、更有效的方法来找到不可约分数。由于它对于较小的输入是成功的,我认为很可能有一种找到不可约分数形式的有效方法。有什么建议吗?

【问题讨论】:

  • n 的范围是多少?
  • @templatetypedef n 范围高达 10^9 和测试用例数量范围高达 10^3
  • 对于n 的前三个值,概率似乎是(2n-1)/(n^2)。有没有关于这个的一般定理?也许是归纳的?
  • 如果这是一个“挑战”问题提交,“超时”(这是一个运行时错误,而不是编译器错误)意味着您必须找到一个巧妙的解决方案。许多此类网站的部分观点是,幼稚的解决方案将失败,是您要解决的真正挑战。
  • @WeatherVane ....这就是我在这里问这个问题的原因....也许像布拉迪姆斯所说的那样凭直觉...但我想要某种证明,以便我可以对类似的问题采用相同的方法...:)

标签: java algorithm performance math


【解决方案1】:

您的hcf 函数并不太慢。相反,问题是你有一个循环 O(n) 次,这在 n = 10^9 时相当多。您可以通过仅计算B &lt;= sqrt(A) 的情况将其归结为O(sqrt(n))。这会给你大约一半的情况,因为通常BA/B 中的一个小于sqrt(A)。唯一的例外是您必须考虑B * B = A 时的情况。

【讨论】:

  • @您的解决方案是正确的。接受的解决方案遵循您的逻辑。不知道为什么OP在打开时没有从在线法官那里阅读其他人的解决方案。
猜你喜欢
  • 2023-01-30
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多