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

 

 

//Pro: P2651 添加括号III

//紫书习题 

//设序列为x1,x2,x3...xn
//可以知道,x2必须在分母上,其他的都可以在分子上,也就变成了x2可不可以被x1*x3*x4*...*xn整除的问题 
//用gcd约分,如果x2==1了,那么就能是整数
//否则就不行 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int N=1e4+5;

int T,n;
int x[N];
int prime[N],cnt;

int gcd(int a,int b)
{
    int c;
    while(b)
    {
        c=b;
        b=a%b;
        a=c;
    }
    return a;
}

int main()
{
    scanf("%d",&T);
    do
    {
        bool flag=0;
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d",x+i);
        x[2]/=gcd(x[1],x[2]);
        for(int i=3;i<=n;++i)
        {
            x[2]/=gcd(x[2],x[i]);
            if(x[2]==1)
            {
                flag=1;
                break;
            }
        }
        if(flag)
            puts("Yes");
        else
            puts("No");
    }while(--T);
    return 0;
}

 

posted @ 2018-05-11 11:01  whymhe  阅读(302)  评论(0编辑  收藏  举报