• 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;
    }
  • 相关阅读:
    zTree学习笔记之展开树和收起树
    添优--史上超级全面的前端面试题大集合
    springboot2.0整合jpa
    Idea快捷键
    实用工具收藏
    nginx
    SQLServer锁的机制
    centos安装jenkins
    java8
    前端开发收藏
  • 原文地址:https://www.cnblogs.com/lovewhy/p/9023497.html
Copyright © 2020-2023  润新知