题目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 ",me.gao_qi()) ; } return 0 ; }