[Daimayuan] 添加括号(C++,数学)

现在给出一个表达式,形如 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 2n10000, 1 ≤ t ≤ 100 1≤t≤100 1t100, 1 ≤ a i ≤ 2 31 − 1 1≤a_i≤2^{31}−1 1ai2311

输入样例
2
4
1 2 1 4
5
6 5 7 9 12
输出样例
Yes
No
解题思路

通过不同的加括号方法,可以发现以下几个规律:

(1)第一个数必定是分子;

(2)第二个数必然是分母;

(3)从第三个数开始,任意数都可以成为分子,且互不影响。

同时,很容易知道:分子越多,分母越少,越容易形成整数。

那么我们的算法实现就很简单了:用其他所有数的乘积去尝试整除第二个数。

最后,AC代码如下:

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitheredSakura_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值