PTA:满足条件的数字有多少?

满足条件的数字有多少?

已知正整数 a0,a1,b0,b1,设某未知正整数 x 满足:
1. x 和 a0 的最大公约数是 a1
2. x 和 b0 的最小公倍数是 b1
求解满足条件的 x 的个数。请你帮助他编程求解这个问题。

对于 100%的数据,保证有 1≤a0,a1,b0,b1≤2,000,000,000。

输入格式:
第一行为一个正整数 n,表示有 n 组输入数据。n≤2000

接下来的 n 行每行一组输入数据,为四个正整数 a0,a1,b0,b1,之间用一个空格隔开。

输出格式:
共n 行。每组输入数据的输出结果占一行,为一个整数。 对于每组数据:若不存在这样的 x,请输出 0; 若存在这样的 x,请输出满足条件的 x 的个数;

输入样例:
在这里给出一组输入。例如:

2
41 1 96 288
95 1 37 1776

输出样例:
在这里给出相应的输出。例如:

6
2

多说一句
这里经常会运行超时,需要以下扩展知识:
在这里插入图片描述在这里插入图片描述
采用此方法,相信可以理解下列代码:

代码示例(仅供参考):

#include<stdio.h>
#include<math.h>
int gmd(int x,int y)
{   
   int m, n, a, b; 
   m=x;
   n=y;
   while(y!=0)
   {
       a=x%y;
       x=y;
       y=a;
   }   
   return x;  
}
int main()
{
	int i,j,k;
	int a0,a1,b0,b1,x,flag1=0,r1,r2;
	int n;
	scanf("%d",&n);
	for(k=1;k<=n;k++)
	{
		flag1=0;
		scanf("%d %d %d %d",&a0,&a1,&b0,&b1);
        r1=a0/a1;r2= b1/b0;
		for(i=1;i*i<=b1;i++)
		{
        
			if(gmd(i/a1,r1)==1&&gmd(r2,b1/i)==1)
			flag1=flag1+1;
		}
		printf("%d\n",flag1);
	}
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值