CF1720A Burenka Plays with Fractions 题解
CF1720A Burenka Plays with Fractions 题解
题意
布伦卡来到了幼儿园。这个幼儿园很奇怪,所以那里的每个孩子都会收到两个分数 \(\frac{a}{b},\frac{c}{d}\) 分子和分母都是整数。然后孩子们被命令玩他们的分数。
布伦卡是个聪明的孩子,所以她注意到,当她拍手一次,她可以将她的两个分数中的一个的分子或分母乘以她选择的任何整数(但她不能将分母乘以0)。现在她想知道使她的分数相等(按数值计算)的最小拍手次数。请帮助她,找出所需的拍手次数!
简化题意:
给你两个分数 \(\frac{a}{b},\frac{c}{d}\) 分子分母均为整数,你可以进行任意次操作,每次操作选择 \(a,b,c,d\) 中任意一个数乘上任何整数 \((c,d不能乘0)\) ,求使 \(\frac{a}{b},\frac{c}{d}\) 相等的最小次数。
分析:
其实我们可以发现,若其中一个分子为 \(0\) 则操作数为 \(1\) .若两个分子都为 \(0\) 则操作数为 \(0\) 而且当其中任意一个分数能化简成为另一个分数,操作数也为 \(0\) .
另一种情况是能将一个分子乘上某个数再化简变为另一个分数,操作数为1.
最后一种情况是两者分子不为 \(0\) 且不能通过上一种情况相等,则需两边分子乘 \(0\) 达到相等.
还有其他情况吗,没有了,答案有可能超过 \(2\) 吗,不可能,因为每对分数都可以经过两次操作变为 \(0\) .
如何实现:
首先,在处理未化简但是相等的分数上,容易联想到交叉相乘法:
即:
若 \(\frac{a}{b}=\frac{c}{d}\) ,则 \(a \times d=b \times c\).
不光可以处理上述问题,还可以处理两分子关于 \(0\) 的情况
而将某个分子乘一个整数时,我们只需要判 断 \(a \times d , b \times c\) 是否能由大数整除小数即可。
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll a,b,c,d;
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>a>>b>>c>>d;
ll q=a*d,h=b*c;//交叉相乘
if(q==h)cout<<0;//未化简的分数的判断
else if(q==0||h==0)cout<<1;//其中一个分子为0
else if(q%h==0||h%q==0)cout<<1;//能将一个分子乘上一个整数达到目的
else cout<<2;//两分子都乘0
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号