现在给出一个表达式,形如 a 1 / a 2 / a 3 / . . . / a n a_1/a_2/a_3/.../a_n a1/a2/a3/.../an。
如果直接计算,就是一个个除过去,比如 1 / 2 / 1 / 4 = 1 / 8 1/2/1/4=1/8 1/2/1/4=1/8。
然而小 A A A 看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数。一种可行的办法是 ( 1 / 2 ) / ( 1 / 4 ) = 2 (1/2)/(1/4)=2 (1/2)/(1/4)=2。
现在给出这个表达式,求问是否可以通过添加一些括号改变运算顺序使其成为一个整数。
输入格式
一个测试点中会有多个表达式。
第一行 t t t ,表示表达式数量。
对于每个表达式,第一行是 n n n,第二行 n n n 个数,第 i i i 个数表示 a i a_i ai
输出格式
输出 t t t 行。
对于每个表达式,如果可以通过添加括号改变顺序使其变成整数,那么输出 Y e s Yes Yes,否则输出 N o No No。
数据范围
2 ≤ n ≤ 10000 2≤n≤10000 2≤n≤10000, 1 ≤ t ≤ 100 1≤t≤100 1≤t≤100, 1 ≤ a i ≤ 2 31 − 1 1≤a_i≤2^{31}−1 1≤ai≤231−1
输入样例
2
4
1 2 1 4
5
6 5 7 9 12
输出样例
Yes
No
解题思路
通过不同的加括号方法,可以发现以下几个规律:
(1)第一个数必定是分子;
(2)第二个数必然是分母;
(3)从第三个数开始,任意数都可以成为分子,且互不影响。
同时,很容易知道:分子越多,分母越少,越容易形成整数。
那么我们的算法实现就很简单了:用其他所有数的乘积去尝试整除第二个数。文章来源:https://www.toymoban.com/news/detail-450847.html
最后,AC代码如下:文章来源地址https://www.toymoban.com/news/detail-450847.html
#include <iostream>
using namespace std;
int main() {
int t, n;
long long a1, a2, sum;
bool flag;
cin >> t;
for (int i = 0; i < t; i++) {
cin >> n;
a1 = a2 = -1;
sum = 1;
flag = false;
for (int i = 0; i < n; i++) {
if (i == 1) {
cin >> a2;
}
else {
cin >> a1;
sum *= a1;
}
if (a2 != -1) {
sum %= a2;
if (sum == 0) {
flag = true;
}
}
}
if (flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
到了这里,关于[Daimayuan] 添加括号(C++,数学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!