[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 }
View Code

 

posted @ 2016-07-13 23:51  CtrlCV  阅读(568)  评论(0编辑  收藏  举报