【解题报告】洛谷P1072 Hankson 的趣味题

【解题报告】洛谷P1072 Hankson 的趣味题

题目链接

https://www.luogu.com.cn/problem/P1072

思路

这道题目我们首先直接模拟,可以得到50pts的高分

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
int T; 
int gcd(int a,int b)
{
	return b? gcd(b,a%b):a; 
}
int lcm(int a,int b)
{
	return 1ll*a*b/gcd(a,b);
}
int main()
{
	cin>>T;
	while(T--)
	{
		int a0,a1,b0,b1;
		int cnt=0;
		cin>>a0>>a1>>b0>>b1;
		for(int i=1;i<=max(a1,b1);i++)
		{
			if(gcd(i,a0)==a1&&lcm(i,b0)==b1)
			cnt++;
		}
		cout<<cnt<<'\n';
	}
	return 0;
}

然后发现可以提前判断一下能不能有,于是我们得到了80pts的高分

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
int T; 
int gcd(int a,int b)
{
	return b? gcd(b,a%b):a; 
}
int lcm(int a,int b)
{
	return 1ll*a*b/gcd(a,b);
}
int main()
{
	cin>>T;
	while(T--)
	{
		int a0,a1,b0,b1;
		int cnt=0;
		cin>>a0>>a1>>b0>>b1;
		if(b1%a1!=0)
		{
			cout<<0<<'\n';
			continue;
		}
		bool flag=false;
		int add=1;
		//cout<<"They are :";
		for(int i=1;i<=max(a1,b1);i+=add)
		{
			if(b1%i==0)
			{
				if(gcd(i,a0)==a1&&lcm(i,b0)==b1)
				{
				//	cout<<i<<" ";
					if(!flag)
					add=i,flag=true;
					cnt++;
				}
			}
		}
		//cout<<'\n';
		cout<<cnt<<'\n';
	}
	return 0;
}

最后我们正经分析

我们可以把 \(lcm\) 变成 \(gcd\) ,然后最大公约数可以直接同除

把他们的最大公约数变成一

然后再枚举,就快多了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
int T; 
int gcd(int a,int b)
{
	return b? gcd(b,a%b):a; 
}
int lcm(int a,int b)
{
	return 1ll*a*b/gcd(a,b);
}
int main()
{
	cin>>T;
	while(T--)
	{
		int a0,a1,b0,b1;
		int cnt=0;
		cin>>a0>>a1>>b0>>b1;
		if(b1%a1!=0)
		{
			cout<<0<<'\n';
			continue;
		}
		bool flag=false;
		int add=1;
		//cout<<"They are :";
		for(int i=1;i*i<=b1;i++)
		{
			if(b1%i==0)
			{
				if(i%a1==0&&gcd(i/a1,a0/a1)==1&&gcd(b1/b0,b1/i)==1)
				cnt++;
				int j=b1/i;
				if(i==j) continue;
				if(j%a1==0&&gcd(j/a1,a0/a1)==1&&gcd(b1/b0,b1/j)==1)
				cnt++;
			}
		}
		//cout<<'\n';
		cout<<cnt<<'\n';
	}
	return 0;
}
posted @ 2021-10-13 23:57  wweiyi  阅读(23)  评论(0编辑  收藏  举报
js脚本