给定一个数字N
,要求找到不同分数的数量,如果减少的分数是P / Q(P和Q是共素),那么P和Q必须是{{ 1}}。
所以首先我想出了这种天真的方法。
<=N
被拒绝为TLE。然后我想到了预先计算的值public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
Scanner sc = new Scanner (System.in);
int t = sc.nextInt();//number of test cases
while(t-->0){
int n = sc.nextInt();//integer N
int count=0;
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(gcd(i,j)==1)
count++;
}
}
System.out.println(count);
}
}
public static int gcd(int a,int b){
if(b!=0)
return gcd(b,a%b);
else
return a;
}
。所以我尝试了这个:
N<=1000000
但现在即使public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
Scanner sc = new Scanner (System.in);
int[] arr = new int[1000001];
arr[0]=0;
for(int i=1;i<1000001;i++)
{
arr[i]=arr[i-1];
for(int j=i-1;j>=0;j--)
{
if(gcd(i,j)==1)
arr[i]++;
}
}
int t = sc.nextInt();
while(t-->0){
int n = sc.nextInt();
System.out.println(arr[n]);
}
}
public static int gcd(int a,int b){
if(b!=0)
return gcd(b,a%b);
else
return a;
}
,N=1
和2
也显示了TLE。即使循环看起来正确,我也无法理解出了什么问题。任何更好的方法也是受欢迎的。
注意:TLE超出时间限制
答案 0 :(得分:1)
for循环很好。我很确定while循环中出现了问题,即你的条件总是评估为真。它可能与某些事情有关 - &gt;意思是暗示而不是(t - )&gt;,我确信这就是你想要的。
更好的方法是实施类似Farey Sequence或Stern-Brocot Sequence的内容。
答案 1 :(得分:0)
您可以使用Euler's totient function和动态编程。
第1步:生成所有素数,直至n的最大可能值。
第2步:为所有totient[i]
计算1 <= i <= max possible value of n
。为此使用动态编程。
totient[1] = 0
totient[i] = i - 1
如果i
是素数
totient[i] = totient[i/d] * totient[d]
用于划分d
的任何i
(循环素数以找到d
)
第3步。 p/q
的不可缩减分数p < q <= i
的数量为totient[2] + totient[3] + totient[4] + ... + totient[i]
(Farey sequence长度)。还要在计算总数时计算。
numberOfFractions[1] = 0
numberOfFractions[i] = numberOfFractions[i-1] + totient[i]