UVa 10892 - LCM Cardinality
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 10892 - LCM Cardinality相关的知识,希望对你有一定的参考价值。
?????????oss ?????? ??????????????? return nat ret inline inpu tput
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: UVa 10892 - 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,ans);
}
return 0;
}
以上是关于UVa 10892 - LCM Cardinality的主要内容,如果未能解决你的问题,请参考以下文章