记录编号 233719 评测结果 AAAAAAAAAA
题目名称 [NOIP 2009]Hankson的趣味题 最终得分 100
用户昵称 Gravatar农场主 是否通过 通过
代码语言 C++ 运行时间 2.019 s
提交时间 2016-03-05 17:51:55 内存使用 2.30 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
bool p[100000+1000]={0};
int A0[100000]={0},A1[100000]={0},B0[100000]={0},B1[100000]={0},prime[100000]={0},tot=1,n,a0,a1,b0,b1;
void make();
int work(int a,int aa,int b,int bb);
void st(int x,int A[]);
void max(int l[],int r[]);
int gcd(int a,int b);
int main(){
	freopen("son.in","r",stdin);
	freopen("son.out","w",stdout);
	make();
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
		printf("%d\n",work(a0,a1,b0,b1));
	}
	return 0;
}
void st(int x,int A[]){
	int  t=x;
	for (int i=0;i<100000;i++) A[i]=0;
	for (int i=1;i<tot;i++){
		if (t<=1) break;
		while(t%prime[i]==0){
			t/=prime[i];
			A[i]++;
		}
	}
	if (t>1) A[0]=t;
	return;
}
void max(int l[],int r[]){
	if (l[0]==r[0]) l[0]=-l[0];
	else l[0]=l[0];
	for (int i=1;i<tot;i++){
		if (l[i]>r[i]) l[i]=l[i];
			else l[i]=-r[i];
	}
	return;
}
int work(int a,int aa,int b,int bb){
	st(aa,A0);
	st(a,A1);
	st(b,B0);
	st(bb,B1);
	max(B1,B0);
	int t=0,s=0;
	for (int i=1;i<tot;i++){
		if (B1[i]>0) for (int j=1;j<=B1[i];j++) t*=prime[i];
		if (B1[i]<0) for (int j=1;j<=-B1[i];j++) s*=prime[i];
		if (B1[0]>0) s*=B1[0];
		if (B1[0]<0) t*=B1[0];
	}
	s*=t;
	for (int i=0;i<tot;i++){
		if (A1[i]==A0[i]) A1[i]=0;
	}
	for (int i=1;i<tot;i++){
		if (A1[i]>0&&B1[i]>A0[i]) return 0;
	}
	if (A1[0]==B1[0]&&A1[0]!=0) return 0;
	if (s%aa!=0) return 0; 
	for (int i=1;i<tot;i++){
		if (B1[i]<0&&A0[i]>0) B1[i]+=A0[i];
	}
	for (int i=1;i<tot;i++){
		if (A1[i]>0&&B1[i]<0) B1[i]=0;
	}
	if (A0[0]>0||A1[0]>0) B1[0]=0;
	else if (B1[0]<0) B1[0]=-1;
	int num=1;
	for (int i=0;i<tot;i++){
		if (B1[i]<0) {
			num*=-1*B1[i]+1;
		}
	}
	return num;
}

void make(){
	for (int i=2;i<=(int)sqrt((double)2000000000);i++) if (!p[i]){
		prime[tot++]=i;
		for (int j=i*i;j<=(int)sqrt((double)2000000000);j+=i) p[j]=1;
	}		
}

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}