Problem Description
对于我们来说求两个数的LCM(最小公倍数)是很容易的事,现在我遇到了一个问题需要大家帮助我来解决这问题,问题是:给你一个数n,然后统计有多少对(a<=b) LCM(a,b)=n;例如LCM(a,b)=12; 即(1,12),(2,12),(3,12),(4,12),(6,12),(12,12),(3,4),(4,6);
Input
输入数组有多组,每组数据包含一个整数n(n<=10^9);
Output
输出每组数据的对数。
Sample Input
2
3
4
6
Sample Output
2 2 3 5 Hint
暴力破解肯定不行,数组存储也不是很好的办法,并且空间不够。而LCM也就是两个数的最小公倍数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n,i,j,num,ans;
while(reader.hasNextInt()){
n=reader.nextInt();
num=0;
long[] a=new long[300];
for(i=1;i*i<=n;i++){
if(n%i==0) {
a[num++]=i;
if(i*i!=n)a[num++]=n/i;
}
}
ans=0;
for(i=0;i<num;i++){
for(j=i;j<num;j++){
if(LCM(a[i],a[j])==n)ans++;
}
}
System.out.println(ans);
}
reader.close();
}
static long LCM(long x,long y)
{
long t,a,b;
a=x;
b=y;
while(b!=0&&a!=0){
t=a%b;
a=b;
b=t;
}
return x*y/a;
}
}