Logo __vector__ 的博客

博客

CF1720A 题解

...
__vector__
2025-12-01 12:55:48

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2022-08-19 12:39:37

题外话

感觉这道题有点降智(应该只是对我来说),就写一篇题解记录一下。

做法

我们可以这样理解:分母乘上一个数 $x$ ,就代表这个分数除以 $x$;分子乘上一个数 $x$,就代表这个分数乘 $x$。

我们先假设:
$\frac{a \cdot x}{b \cdot y} = \frac{c}{d}$
转化为:
$\frac{a}{b} \cdot \frac{x}{y} = \frac{c}{d}$
然后计算得出:
$\frac{x}{y} = \frac{c}{d} \cdot \frac{b}{a}$
这样我们就知道了,$\frac{a}{b}$ 分子和分母各乘上多少,才能与 $\frac{c}{d}$ 相等。

如果 $x = 1$,那么分子不需要作乘法,否则分子需要进行一次乘法。
同理,如果 $y=1$,那么分母不需要作乘法,否则分母需要进行一次乘法。

这样就结束了吗?没有。

分子可能为 $0$。

如果两个分数的分子中有一个为 $0$,那么只需要将另一个分数的分子乘上 $0$,就行了。

如果两个分数的分子都为 $0$,那么不需要处理。

Code

#include <bits\/stdc++.h>
using namespace std;
namespace Main
{
	typedef long long ll;
	int t;
	ll gcd(ll a,ll b)
	{
		return !b?a:gcd(b,a%b);
	}
	ll lcm(ll a,ll b)
	{
		return a\/gcd(a,b)*b;
	}
	void main()
	{
		scanf("%d",&t);
		while(t--)
		{
			ll a,b,c,d;
			scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
			if(a==0&&c!=0)
			{
				printf("1\n");
				continue;
			}
			else if(a!=0&&c==0)
			{
				printf("1\n");
				continue;
			}
			if(a==0&&c==0)
			{
				printf("0\n");
				continue;
			}
			a*=d;
			b*=c;
			ll _gcd=gcd(a,b);
			a\/=_gcd;
			b\/=_gcd;
			int ans=0;
			if(b>1)ans++;
			if(a>1)ans++;
			printf("%d\n",ans);
		}
	}
}
int main()
{
	Main::main();
	return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。