emmmmm最不会做的就是各种因为算法不对然后时间复杂度太大各种TLE的题。。。。。不说废话
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
一开始用常规方法两重for循环,毫不留情的时间超限。。。因为数开得太大1e9。。。后来用上打表,就是先对n的所有因子打表,然后开两个for在n的因子里边筛。。。
但是!!!很遗憾!!!
打出来还是时间超限。。。后来才知道打表打的不对,打到开平方n,然后存入因子i和n/i。
AC代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[10000];
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int n,s,x,y;
int i,j,k;
while(~scanf("%d",&n))
{
k=0;
s=0;
for(i=1; i<=sqrt(n); i++)
{
if(n%i==0)
{
a[k++]=i;
if(n/i!=i)
{
a[k++]=n/i;
}
}
}
sort(a,a+k,cmp);
for(i=0; i<k; i++)
{
for(j=i; j<k; j++)
{
x=__gcd(a[i],a[j]);
y=a[i]/x*a[j];
if(y==n)
{
s++;
}
}
}
printf("%d\n",s);
}
return 0;
}