流水依依

希望朋友们有个好的身体,开开心心工作与学习。

博客园 首页 新随笔 联系 订阅 管理

题目1493:公约数

时间限制:1 秒

内存限制:128 兆

特殊判题:

题目描述:

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

输入:

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

输出:

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

样例输入:
8 16
22 16
样例输出:
4
2
来源:
2013年王道论坛计算机考研机试全真模拟考试
思路:比较简单的问题,对2数质因数分解。寻找拥有共同质因数,取最小的。关键在于编码。
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <set>
#include <limits.h>
#include <fstream>
#include <map>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
const int size=10008 ;
int prime[size] ;
bool is_prime[size] ;
int prime_size ;
void make_prime(){
   prime_size=0 ;
   memset(is_prime,0,sizeof(is_prime)) ;
   for(int i=2;i<size;i++){
      if(!is_prime[i])
         prime[prime_size++]=i ;
      for(int j=0;j<prime_size&&prime[j]*i<size;j++){
         is_prime[prime[j]*i]=1 ;
         if(i%prime[j]==0)
            break ;
      }
   }
}
struct Me{
    int N , M ;
    map<int ,int>mp ;
    Me(){}
    Me(int n, int m):N(n),M(m){}
    void make_prime_factor(int N){
        mp.clear() ;
        for(int i=0;i<prime_size&&prime[i]*prime[i]<=N;i++){
            if(N%prime[i]==0){
                int n=0 ;
                while(N%prime[i]==0){
                    n++ ;
                    N/=prime[i] ;
                }
                mp[prime[i]]=n ;
            }
        }
        if(N!=1)
            mp[N]=1 ;
    }
    int gao_qi(){
       make_prime_factor(N) ;
       int ans=1 ;
       for(int i=0;i<prime_size&&prime[i]*prime[i]<=M;i++){
            if(M%prime[i]==0){
                int n=0 ;
                while(M%prime[i]==0){
                    n++ ;
                    M/=prime[i] ;
                }
                ans*=(Min(mp[prime[i]],n)+1) ;
            }
        }
        if(M!=1)
            ans*=(Min(mp[M],1)+1) ;
        return ans ;
    }
};
int main(){
  make_prime() ;
  int n, m;
  while(scanf("%d%d",&n,&m)!=EOF){
     Me me(n,m) ;
     printf("%d\n",me.gao_qi()) ;
  }
  return 0 ;
}

 

posted on 2013-08-12 09:17  流水依依  阅读(390)  评论(0编辑  收藏  举报