• 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
    ");
          else
    	printf("No
    ");
        }
      return 0;
    }
    
  • 相关阅读:
    http 学习 1-1 chapter1-HTTP概述
    2048 游戏实现原理
    safari 日期对象新建new Date( timeStr ) 参数TimeStr格式
    js
    js 常见弹出框学习
    JS引入CSS文件
    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
    java复制文件 转
    Map键值对,一种思路
    写入excel表格数据
  • 原文地址:https://www.cnblogs.com/gshdyjz/p/9877295.html
Copyright © 2020-2023  润新知