33,009
社区成员
发帖
与我相关
我的任务
分享
int fCount(int a){
int c = 0, i = 2;
while (a > 0){
while (a % i == 0){
c++;
a /= i;
}
i++;
}
}
//这是求两个数的公因子的个数的
//等价于求这两个数的最大公约数的因子的个数
//注意一下数据范围
#include <stdio.h>
#define N 1000
int mark[N+1] = {0};
void InitPrimeTable()
{
int i, j, k;
for (i = 2; i-N-1; mark[i] = i + 1, i++);
for (i = 2; i-N-1; mark[k] = N + 1, i = mark[i])
for (k = i, j = mark[i]; j-N-1; j = mark[j])
if (j%i) mark[k] = j, k = j;
}
int gcd(int a, int b)
{return b ? gcd(b, a%b) : a;}
int main(int argc, char* argv[])
{
int n;
InitPrimeTable();
scanf("%d", &n);
while (n--)
{
int a, b, i, curr = 0, result = 1;
int n;
scanf("%d%d", &a, &b);
n = gcd(a, b);
for (i = 2; i<N+1 && n >= i; i = mark[i])
{
int c = 0;
while (n%i==0) ++c,n/=i;
result *= c+1;
}
if (n != 1) result *= 2;
printf("%d\n", result);
}
return 0;
}