[BZOJ1385] [Baltic2000] Division expression (数学)

Description

  除法表达式有如下的形式: X1/X2/X3.../Xk 其中Xi是正整数且Xi<=1000000000(1<=i<=k,K<=10000) 除法表达式应当按照从左到右的顺序求,例如表达式1/2/1/2的值为1/4.但可以在表达式中国入括号来改变计算顺序,例如(1/2)/(1/2)的值为1.现给出一个除法表达式E,求是告诉是否可以通过增加括号来使其为E‘,E‘为整数

Input

  先给出一个数字D,代表有D组数据. 每组数据先给出一个数字N,代表这组数据将有N个数。 接下来有N个数,分别代表X1,X2,X3,...,XN

Output

  如果能使得表达式的值为一个整数,则输出YES.否则为NO

Sample Input

2
4
1
2
1
2
3
1
2
3

Sample Output

YES
NO

HINT

Source

Solution

  第一个数必为分子,第二个数必为分母,剩下的数既可以是分子又可以是分母,所以当表达式形如$X_1/(X_2/X_3/\cdots/X_N)$时最有可能是整数

  判断$X_2$能否被其他数的积整除即可(你不会傻到把这些数乘起来吧)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[10005];
 4
 5 int gcd(int x, int y)
 6 {
 7     return y ? gcd(y, x % y) : x;
 8 }
 9
10 int main()
11 {
12     int d, n, t;
13     scanf("%d", &d);
14     while(d--)
15     {
16         scanf("%d", &n);
17         for(int i = 1; i <= n; ++i)
18             scanf("%d", a + i);
19         if(n == 1)
20         {
21             puts("YES");
22             continue;
23         }
24         swap(a[1], a[2]);
25         for(int i = 2; i <= n && a[1] > 1; ++i)
26             t = gcd(a[i], a[1]), a[1] /= t;
27         if(a[1] == 1) puts("YES");
28         else puts("NO");
29     }
30     return 0;
31 }

时间: 2024-10-08 12:15:15

[BZOJ1385] [Baltic2000] Division expression (数学)的相关文章

bzoj1385: [Baltic2000]Division expression

欧几里得算法.可以发现规律,a[2]作为分母,其他作为分子,必定是最好的选择.判断是否为整数即可. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) int read(){ int x=0;char c=getchar(); whil

BZOJ 1385: [Baltic2000]Division expression

题目 1385: [Baltic2000]Division expression Time Limit: 5 Sec  Memory Limit: 64 MB Description 除法表达式有如下的形式: X1/X2/X3.../Xk 其中Xi是正整数且Xi<=1000000000(1<=i<=k,K<=10000) 除法表达式应当按照从左到右的顺序求,例如表达式1/2/1/2的值为1/4.但可以在表达式中国入括号来改变计算顺序,例如(1/2)/(1/2)的值为1.现给出一个除

【BZOJ]】1385 [Baltic2000]Division expression

[算法]欧几里德算法 [题解]紫书原题 #include<cstdio> #include<algorithm> using namespace std; const int maxn=10010; int T,t,n,a[maxn]; int gcd(int a,int b) {return b==0?a:gcd(b,a%b);} int main() { scanf("%d",&T); for(int i=1;i<=T;i++) { scanf

【BZOJ】【1385】【Baltic2000】Division expression

欧几里得算法 普通的求个gcd即可……思路题 因为要求尽量是整数……所以 x1/(x2/x3/x4..../xn)是最大的结果了,因为x2必须为分母,x1必须为分子……x3~xn可分子可分母,所以都丢到分子上,结果ans为整数的可能性最大=.=因为如果放下去相当于 ans/(xi^2) 嗯……应该很好理解- - 1 /************************************************************** 2 Problem: 1385 3 User: Tun

[bzoj1385]Division expression

容易发现a2一定是分母,且容易做到其余都是分子,因此相当于判定a2能否整除a1*a3*……*an,不断让a2除以其与其他数的gcd即可(注意特判n=1) 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,s,x; 4 int gcd(int x,int y){ 5 if (!y)return x; 6 return gcd(y,x%y); 7 } 8 int main(){ 9 scanf("%d",&am

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

轻松地进入python世界

3 . 注释 comments在python中以‘#’字符hash character开头,一直到这一行的结束.注释可以出现在一行的开始,或者在代码的后边空闲部分.但是不能出现在一个字面字符串string中.在字符串中,‘#’仅仅是一个‘#’字符. # this is the first comment spam = 1 # and this is the second comment # ... and now a third! text = "# This is not a comment

interpreter(解释器模式)

一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用不到这个模式,但是看一看还是能受到一定的启发的. 二.定义与结构 解释器模式的定义如下:定义语言的文法,并且建立一个解释器来解释该语言中的句子.它属于类的行为模式.这里的语言意思是使用规定格式和语法的代码. 在GOF的书中指出:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例

28. SQL -- TSQL函数

T-SQL 函数 SQL Server 内置函数可以是确定的或是不确定的.如果任何时候用一组特定的输入值调用内置函数,返回的结果总是相同的,则这些内置函数为确定的.如果每次调用内置函数时,即使用的是同一组特定输入值,也总返回不同结果,则这些内置函数为不确定的 1).字符转换函数 2).去空格函数 l LTRIM() 把字符串头部的空格去掉. select LTRIM(' big') 3).取子串函数 l left() LEFT(<character_expression>, <integ