LCM的个数
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于我们来说求两个数的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);
输入
输入数组有多组,每组数据包含一个整数n(n<=10^9);
输出
输出每组数据的对数。
示例输入
2 3 4 6
示例输出
2 2 3 5
我们学校的第七届校赛题,当时没A出来,后来补题时问了一下A出来的同学,原来暴力就能过,而且时间很短,当时没敢敲,一直以为有不知道的定理,导致比赛时最后两个多小时在发呆,需要反思,
这个题的大概思路就是先把能够把n整除的数存下了,再用一下gcd(其实就是求最大公约数),然后两个for就可以了
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int ls[100000]; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int n; while(~scanf("%d",&n)) { int k = 0, i; for(i = 1; i <= sqrt(n); i++) { if(n%i == 0) { ls[k++] = i; if(n/i != i) { ls[k++] = n/i; } } } sort(ls,ls+k); int j,c = 0; for(i = 0; i < k; i++) { for(j = i+1; j < k; j++) { if(ls[i]/gcd(ls[i],ls[j])*ls[j] == n) c++; } } printf("%d\n",c+1); } return 0; }