P2651 添加括号III

题目描述

现在给出一个表达式,形如a1/a2/a3/.../an

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

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

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

输入输出格式

输入格式:

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

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

对于每个表达式,第一行是n,第二行n个数,第i个数表示ai。

输出格式:

输出t行。

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

输入输出样例

输入样例#1: 复制
2
4
1 2 1 4
5
6 5 7 9 12
输出样例#1: 复制
Yes
No

说明

对于40%的数据,n<=16

对于70%的数据,n<=100

对于全部数据,2<=n<=10000,1<=t<=100,1<=ai<=maxlongint


 

通过一些位置括号的尝试,我们发现,a1肯定是做分子的,a2肯定是做分母的,所以我们只需要分子尽量够大即可,于是把其他的的ai都放到分子上去(显然可以),

然后在判断一下分子除分母是不是整数即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

#define ll long long
#define il inline
#define db double

using namespace std;

il int gi()
{
  int x=0,y=1;
  char ch=getchar();
  while(ch<'0'||ch>'9')
    {
      if(ch=='-')
	y=-1;
      ch=getchar();
    }
  while(ch>='0'&&ch<='9')
    {
      x=x*10+ch-'0';
      ch=getchar();
    }
  return x*y;
}

int a[100045];

int main()
{
  int T=gi();
  for(int i=1;i<=T;i++)
    {
      int n=gi();
      for(int i=1;i<=n;i++)
	a[i]=gi();
      ll x=a[1],y=a[2];
      for(int i=3;i<=n;i++)
	x=x*a[i]%y;
      if(x%y==0)
	printf("Yes\n");
      else
	printf("No\n");
    }
  return 0;
}

 

posted @ 2018-10-30 15:52  GSHDYJZ  阅读(246)  评论(0编辑  收藏  举报