【题解】洛谷P1027 Hankson的趣味题(gcd 枚举 数学)

纯粹的数学推理题。。。找到思路后代码实现还是不难的。

注意不要开long long。。。不然会TLE一个点

思路:https://zzlzk.blog.luogu.org/solution-p1072

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define ll long long
using namespace std;
int a0,a1,b0,b1;
int t;
int gcd(int x,int y)
{
	if(x<y) swap(x,y);
	if(y==0) return x;
	return gcd(y,x%y);
}
inline int getint()
{
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	int ans=0;
	while(ch>='0'&&ch<='9')
	{
		ans=ans*10+ch-'0'; 
		ch=getchar();
	}
	return ans;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		a0=getint();
		a1=getint();
		b0=getint();
		b1=getint();
		//scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
		int ans=0;
		int p=a0/a1,q=b1/b0;
		for(int i=1;i<=sqrt(b1);i++)
		{
			if(b1%i==0)
			{
				if(i%a1==0&&gcd(i/a1,p)==1&&gcd(q,b1/i)==1) ans++;
				int y=b1/i;
				if(i==y) continue;
				if(y%a1==0&&gcd(y/a1,p)==1&&gcd(q,b1/y)==1) ans++;
			}
			
		}
		printf("%d\n",ans);
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值