P2651 添加括号III
一、解题思路
这道题有些意思,因为\(a\)肯定是分子,怎么想办法也不可能变成分母。\(b\)肯定是分母,怎么的也变不成分子。\(c,d,e,f...\)就是有可能是分子,也有可能是分母,尽量想办法让它们全是分子,这样出现整数的概率高,出现在分母,还得想办法去约分掉它,麻烦。(贪心)
那它们是否真的能都是分子呢?可以的,只要在不同的地方加上小扩号,就可全都翻上去,变成分子!!!!
遇事不决,小学数学:
1、在乘除混合运算中“去括号”或添“括号”的方法:
\(① a \times (b \div c) = a\times b \div c\)
\(② a \div (b \times c)=a \div b \div c\)
\(③ a \div (b \div c)=a \div b \times c\)
2、举例
$①1320×500÷250=1320×(500÷250)=1320×2=2640 $
\(②4000÷125÷8=4000÷(125×8)=4000÷1000=4\)
\(③5600÷(28÷6)=5600÷28×6=200×6=1200\)
明白了吧,我们现在用的是性质\(3\),就是连除法,可以转为\(a×c÷b\),其它的类似,都翻到分子上去,分母只保留 \(a\)
二、C++代码
#include <bits/stdc++.h>
using namespace std;
int t;
//最大公约数
int gcd(int x, int y) {
return y ? gcd(y, x % y) : x;
}
int main() {
cin >> t;
while (t--) {
int n;
cin >> n;
//一次读入第一个和第二个
int a, b;
cin >> a >> b;
b /= gcd(a, b);//去掉a,b公因子,目标是b=1,a已经发近挥不出来力量啦
//逐个读入,逐个约分
for (int i = 3; i <= n; i++) {
int x;
cin >> x;
b /= gcd(x, b);
}
if (b == 1) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}