记录编号 274525 评测结果 AAAAAAAAAA
题目名称 [NOIP 2009]Hankson的趣味题 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 0.232 s
提交时间 2016-06-29 09:12:42 内存使用 0.33 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=5000;
int cun[maxn],cnt,tot,n;
int a,a0,b,b0;
void Devide(int x)
{
	for(int i=1;i<=sqrt(x);i++)
	{
		if(x%i==0)
		{
			if(i!=1)
			{
				cun[++tot]=i;
			}
			
			if(x/i!=1&&x/i!=i)cun[++tot]=x/i;//平方加一个; 
		}
	}
} 
int gcd(int a,int b)
{
	if(b==0)return a;
	return gcd(b,a%b);
} 
int main()
{
	/*
	2
	10 10 10 10
	5 1 2 10
	ans 1 0
	*/
	/*
	10
	90 2 9 18
	73 1 98 196
	61 1 75 300
	21 1 17 1003
	80 1 42 3738
	72 18 47 2538
	20 4 18 252
	43 1 63 504
	60 4 66 264
	44 1 23 897
	*/
	/*
	3
	6
	2
	4
	2
	3
	6
	2
	2
	*/
	freopen("son.in","r",stdin);freopen("son.out","w",stdout);
	int T;
	cin>>T;
	while(T-->0)
	{
		scanf("%d%d%d%d",&a,&a0,&b,&b0);
		/*
		1. x 和 a 的最大公约数是 a0; 
		2. x 和 b 的最小公倍数是 b0。 
		*/
		memset(cun,0,sizeof(cun));
		tot=0;
		cnt=0;
		Devide(b);//分解b质因数;  
		int bob=b0/b;//储存b0为b的几倍;
		int gy=gcd(bob,b);//GY储存公约数;
		int gb=bob/gy*b;//GB储存公倍数;
		if( b%bob || b==bob || b==b0)
		{
			if( gcd(bob,a)==a0 && gb==b0)
			{
				cnt++;
			}
		}
		for(int i=1;i<=tot;i++)
		{
			int tp=cun[i]*bob;
			int Gy=gcd(tp,a);
			if(Gy!=a0)continue;
			Gy=gcd(b,tp);
			int Gb=tp/Gy*b;
			if(Gb==b0)
			{
				if( b%tp || (b==tp&&b0==b) || b==b0 )
				{
					cnt++;
				}
			}
		}
		printf("%d\n",cnt);
	}
}