比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 Hankson的趣味题 最终得分 100
用户昵称 Emine 运行时间 0.059 s
代码语言 C++ 内存使用 0.50 MiB
提交时间 2017-05-22 17:40:16
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

const int maxn=50000;

int p[maxn]={0};
long a0,a1,b0,b1,sum=1,low=0,high=0;
int ina0,ina1,inb0,inb1;
void prime(){     //筛法生成素数
	bool l[maxn]={0};
	int i,j,k=0,tmp;
	tmp=(int)sqrt((double)maxn);
	for(i=2;i<maxn;i++){
		if(!l[i]){     //素数
			p[k]=i,k++;
			if(i<=tmp){
				for(j=i*i;j<=maxn;j+=i) l[j]=1;
			}
		}
	}
}
int gin(long *a,long p){     //a的分解中有几个p
	int sum=0;
	while(*a%p==0){
		*a/=p,sum++;
	}
	return sum;
}
void gs(int pi){     //估算 
	ina0=gin(&a0,pi),ina1=gin(&a1,pi);
	inb0=gin(&b0,pi),inb1=gin(&b1,pi);
	low=ina1;
	if(inb0<inb1) low=inb1;
	high=inb1;
	if(ina0>ina1) high=ina1;
	if(high>=low) sum*=(high-low+1);
	else sum=0;
}

int main(){
	freopen("son.in","r",stdin);
	freopen("son.out","w",stdout);
	prime();
	int n,i;
	cin>>n;
	for(i=1;i<=n;i++){
		sum=1,low=0,high=0;
		scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
		for(int i=0;p[i]*p[i]<=b1&&p[i]!=0;i++)
		    gs(p[i]);
		if(b1>1) gs(b1);
		printf("%d\n",sum);
	}
	return 0;
}