题目1493:公约数

题目描述:

给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。

输入:

输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。

输出:

对于每组测试数据,输出为一个整数,表示a和b的公约数个数。

样例输入:
8 16
22 16
样例输出:
4
2
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int N = 10010;
const int M = 100;
 
bool vis[N];
vector<int> vPrime;
int a, b;
int factor[M];
int factorCnt[M];
int total;
 
void sieve();
void solve();
 
int main()
{
 
    #ifndef ONLINE_JUDGE
        //freopen("d:\\OJ\\uva_in.txt", "r", stdin);
    #endif // ONLINE_JUDGE
 
    sieve();
    while (scanf("%d%d", &a, &b) == 2) {
        solve();
    }
    return 0;
}
 
void sieve()
{
    memset(vis, true, sizeof(vis));
 
    vis[0] = vis[1] = false;
 
    for (int i = 2; i <= 100; i++) {
        if (vis[i]) {
            for (int j = i * i; j < N; j += i) vis[j] = false;
        }
    }
 
    for (int i = 2; i < N; i++) {
        if (vis[i]) vPrime.push_back(i);
    }
}
 
 
void solve()
{
    total = 0;
 
    for (size_t i = 0; i < vPrime.size(); i++) {
        if (a < vPrime[i]) break;
 
        if (a % vPrime[i] == 0) {
            int cnt = 0;
            while (a % vPrime[i] == 0) {
                cnt++;
                a /= vPrime[i];
            }
            factor[total] = vPrime[i];
            factorCnt[total++] = cnt;
        }
    }
 
    if (a != 1) {
        factor[total] = a;
        factorCnt[total++] = 1;
    }
 
    int ans = 1;
    for (int i = 0; i < total; i++) {
        if (b % factor[i] == 0) {
            int cnt = 0;
            while (b % factor[i] == 0) {
                cnt++;
                b /= factor[i];
            }
            ans *= (min(cnt, factorCnt[i]) + 1);
        }
    }
 
    printf("%d\n", ans);
}



你可能感兴趣的:(题目1493:公约数)