我一直相信这道题有十分巧妙的解法的,去搜了好多题解发现有的太过玄妙不能领会。
最简单的就是枚举n的所有约数,然后二重循环找lcm(a, b) = n的个数
1 #include <cstdio> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } 7 8 int lcm(int a, int b) { return a / gcd(a, b) * b; } 9 10 int main() 11 { 12 //freopen("in.txt", "r", stdin); 13 14 int n; 15 while(scanf("%d", &n) == 1 && n) 16 { 17 vector<int> a; 18 for(int i = 1; i * i <= n; i++) if(n % i == 0) 19 { 20 if(i * i == n) a.push_back(i); 21 else { a.push_back(i); a.push_back(n / i); } 22 } 23 sort(a.begin(), a.end()); 24 int num = a.size(), ans = 0; 25 for(int i = 0; i < num; i++) 26 for(int j = i; j < num; j++) 27 if(lcm(a[i], a[j]) == n) 28 ans++; 29 printf("%d %d\n", n, ans); 30 } 31 32 return 0; 33 }
UVa 10892 (GCD) LCM Cardinality
原文:http://www.cnblogs.com/AOQNRMGYXLMV/p/4356542.html