【发布时间】:2016-12-26 22:28:52
【问题描述】:
给定一个正整数n,要求从[1...n] 集合中找出两个数字A 和B 的概率,使得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