UVA 10892 LCM Cardinality (分解因數+暴力)

_TCgogogo_發表於2015-08-09
LCM Cardinality

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 different 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 find out the LCM cardinality of a number.

Input
The input file contains at most 101 lines of inputs. Each line contains an integer N (0 < N < 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


題目連結:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1833

題目大意:問n是多少個數對的最小公倍數

題目分析:考慮到n只有2e9,直接分解因數爆搞


#include <cstdio>
#include <cstring>
#define ll long long
int const MAX = 1e5;
int const LIM = 2e9;
int fac[MAX], cnt, n;

int gcd(int a, int b)
{
    while(b)
    {
        int tmp = a;
        a = b;
        b = tmp % b;
    }
    return a;
}

ll lcm(int a, int b)
{
    return (ll) a * b / gcd(a, b);
}

void cal()
{
    cnt = 0;
    for(int i = 1; i * i <= n; i++)
    {
        if(n % i == 0)
        {
            fac[cnt++] = i;
            fac[cnt++] = n / i;
        }
        if(fac[cnt - 1] == fac[cnt - 2])
            cnt --;
    }
}

int main()
{
    while(scanf("%d", &n) != EOF && n)
    {
        cal();
        int ans = 0;
        for(int i = 0; i < cnt; i++)
            for(int j = i; j < cnt; j++)
                if(lcm(fac[i], fac[j]) == n)
                    ans ++;
        printf("%d %d\n", n, ans);
    }
}


相關文章