P2651 添加括号III 题解

题目链接

P2651 添加括号III

题目描述

现在给出一个表达式,形如 \(a_{1}/a_{2}/a_{3}/.../a_{n}\)

如果直接计算,就是一个个除过去,比如 \(1/2/1/4 = 1/8\)

然而小\(\text{A}\)看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数。一种可行的办法是 \((1/2)/(1/4)=2\)

现在给出这个表达式,求问是否可以通过添加一些括号改变运算顺序使其成为一个整数。

输入格式

一个测试点中会有多个表达式。

第一行 \(t\) ,表示表达式数量。

对于每个表达式,第一行是 \(n\),第二行 \(n\) 个数,第 \(i\) 个数表示 \(a_{i}\)

输出格式

输出 \(t\) 行。

对于每个表达式,如果可以通过添加括号改变顺序使其变成整数,那么输出 Yes,否则输出 No

输入输出样例 #1

输入 #1

2
4
1 2 1 4
5
6 5 7 9 12

输出 #1

Yes
No

说明/提示

  • 对于 \(40\%\) 的数据,\(n \le 16\)
  • 对于 \(70\%\) 的数据,\(n \le 100\)
  • 对于 \(100\%\) 的数据, \(2 \le n \le 10000\)\(1 \le t \le 100\)\(1 \le a_{i}\le 2^{31}-1\)

题解

把算式化为分数,那么a1肯定是分子,a2肯定是分母,所以a3以后尽量都要变成分子,也就是 \(1/(a2/a3/a4/...)\) 所以我们只要确认 \(a1a3a4.../a2\) 是否是整数,也就是\(a1a3a4...\%a2\)(%是取模符) 是否为0。

又因为\(a_{i}\le 2^{31}-1\),所以直接乘会超long long,如果你非要写高精我也不拦你,但随时取模明显更简单。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[11111];
int t,n,i,s;
signed main(){
  cin>>t;
  for(;t>0;t--){
    cin>>n;
    for(i=1;i<=n;i++){
      cin>>a[i];
      if(i>2)
        a[i]%=a[2];
    }
    a[1]%=a[2];
    for(i=3;n!=2&&i<=n;i++){
      a[1]*=a[i];
      a[1]%=a[2];//随时取模
    }
    if(a[1]==0)
      cout<<"Yes\n";
    else
      cout<<"No\n";
  }
  return 0;
}
posted @ 2026-04-08 22:33  huan9178  阅读(3)  评论(0)    收藏  举报