http://ac.jobdu.com/problem.php?pid=1493
思路:
1、求最大公约数,gcd
2、最大公约数,因式分解,(循环除小于bound的素数)
3、k1个因子1,k2个因子2,k3个因子3...
4、ans=(k1+1)(k2+1)(k3+1)....
#include <stdio.h>
#include <string.h>
#include <math.h>
int prime[110001]; //数组开的大一点,求10000以内的素数
bool mark[110001];
int size;
void init()
{
int i;
memset(prime,0,sizeof(prime));
memset(mark,0,sizeof(mark));
size=0;
for (i=2;i<=110000;i++)
{
if (mark[i])
{
continue;
}
prime[size++]=i;
if (i>=1000)
{
continue;
}
for (int j=i*i;j<=110000;j+=i)
{
mark[j]=true;
}
}
}
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int i,a,b;
init();
while (scanf("%d%d",&a,&b)!=EOF)
{
int x;
x=gcd(a,b);
int bound=sqrt(x)+1;
int k=0,ans=1;
for (i=0;prime[i]<bound;i++)
{
while (x%prime[i]==0)
{
k++;
x/=prime[i];
}
ans*=(k+1);
k=0;
if (x==1) //能分解完
{
break;
}
}
if (x!=1) //若有大于bound的因子,则其一定只有一个
{
ans*=2;
}
printf("%d\n",ans);
}
return 0;
}