UVa 10892 - LCM Cardinality
Description
A pair of numbers has a unique LCM but a single number can be the LCM of more than one possible pairs. For example 12 is the LCM of (1, 12), (2, 12), (3,4) etc. For a given positive integer N, the number of di?erent integer pairs with LCM is equal to N can be called the LCM cardinality of that number N. In this problem your job is to ?nd out the LCM cardinality of a number.
Input
The input ?le contains at most 101 lines of inputs. Each line contains an integer N \((0 \lt N \le 2*10^9)\) . Input is terminated by a line containing a single zero. This line should not be processed.
Output
For each line of input except the last one produce one line of output. This line contains two integers N and C. Here N is the input number and C is its cardinality. These two numbers are separated by a single space.
Sample Input
2
12
24
101101291
0
Sample Output
2 2
12 8
24 11
101101291 5
Resume
對於給定的數N,求出以N為最小公倍數的有序數對個數。
Analysis
剛看到題目,苦思冥想,以為要什麽神奇的數論方法來解決,甚至想到了標準分解,無奈要求的質數太大。
後來在同學的啟迪下,發現一個數的因數並不多,大概在 \(\ln N\) 級別上(沒找到準確的理論),那就可以直接暴力枚舉解決嘍。
時間復雜度 \(O(N) = \sqrt {N} {(\ln N)}^2\) 左右(迷。
Code
////////////////////////////////////////////////////////////////////// //Target: UVa10892 - LCM Cardinality //@Author: Pisceskkk //Date: 2019-2-16 ////////////////////////////////////////////////////////////////////// #include<cstdio> #include<algorithm> using namespace std; int n,cnt,f[10000],ans; int gcd(int a,int b){return b==0?a:gcd(b,a%b);} int lcm(int a,int b){return 1ll*a*b/gcd(a,b);} //1LL 防止爆int int main(){ while(~scanf("%d",&n) && n){ ans = cnt = 0; for(int i=1;i*i<=n;i++){ if(n%i == 0){ f[++cnt]=i; if(i*i != n)f[++cnt]=n/i; } } sort(f+1,f+1+cnt); for(int i=1;i<=cnt;i++){ for(int j=1;j<=i;j++){ if(lcm(f[j],f[i]) == n)ans++; } } printf("%d %d\n",n,ans); } return 0; }
UVa 10892 - LCM Cardinality