游客 Signup | Login
中文 | En

2344 - 最大公约数和最小公倍数问题

输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数。

条件:

1. P,A是正整数;

2. 要求P,Q以x0为最大公约数,以y0为最小公倍数。

试求:

满足条件的所有可能的两个正整数的个数。


Input

每个测试文件只包含一组测试数据,每组两个正整数x0和y0(2<=x0<100000,2<=y0<=1000000)


Output

对于每组输入数据,输出满足条件的所有可能的两个正整数的个数。

下面是对样例数据的说明:

输入3 60

此时的P Q分别为:

    3     60

    15   12
    12   15
    60   3

<span>所以,满足条件的所有可能的两个正整数的个数共4种。<br />

<span><br />

Examples

Input

3 60

Output

4

Solution C

#include<stdio.h>

int main()
{
  int x,y,m,i,j,n;
  scanf("%d%d",&x,&y);
  m=x>y?x:y;
  int count=0;
  for(i=2;i<=m;i++)
  {
	  int k=i>x*y/i?x*y/i:i;
	  int h=i>x*y/i?i:x*y/i;
	  for(j=k;j>0;j--)
	  {
	    if((i%j==0)&&(x*y/i%j==0))
			break;
	  }
	  for(n=h;n<=x*y;n++)
	  {
	    if((n%i==0)&&(n%(x*y/i)==0))
			break;
	  }
	  if(j==x&&n==y)
		  count++;
  }
  printf("%d\n",count);
  return 0;
}

Solution C++

#include<stdio.h>
int g(int n,int m)
{
	int temp,r;
	if(n<m) 
	{ 
		temp=n; 
		n=m; 
		m=temp; 
	} 
	while(m!=0) 
	{ 
		r=n%m; 
		n=m; 
		m=r; 
	} 
	return n;
}
int main()
{
	int a,b,i,j,count;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		count=0;
		for(i=a;i<=b;i++)
		{
			for(j=i+1;j<=b;j++)
			{
				if(g(i,j)==a&&i*j/g(i,j)==b)
					count++;
			}
		}
		printf("%d\n",2*count);
	}
	return 0;
}
Time Limit 1 second
Memory Limit 125 MB
Discuss Stats
上一题 下一题