luogu p2651 添加括号Ⅲ

题目描述

现在给出一个表达式,形如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/a3/.../an的形式

(题目中的数据已经保证了ai是正整数)

分析:通过加括号的方式使得最终分数的分子所含的所有因子包含分母上的所有因子,也就是通过约分也是是最终的分母变为1

a2一定在最终的分母上,为什么这么说呢?

对于a1/a2/a3/.../an,考虑加括号的方式:

我们可以很容易地知道,a1一定要作为分母出现,因为没有任何一个数在a1之前。所以我们就可以看作是a1去除一个数,这个数是由a2/a3/.../an通过加括号的方式算出的

现在我们要做的,就是使(a2/a3/.../an)中所含的因子数尽量少,此时已经与a1无关了。

可以证明,(a2/a3/.../an)的时候,因子是最少的:

对于(a2/a3/.../an)来说,a2作为分子,不管后面的数字如何添加括号,对于a2,只有乘这个数或是除以这个数(假设中间结果不约分)。a2每乘一个数b,因子加上(b包含的所有因子),a2除以所有b,因子减去(b包含的所有因子),a2中不含的因子最终将加到a1上。

可以看出,(a2/a3/.../an)中间不加括号,进行连除时,a2可以在不增加新的因子情况下,因子最少,所以我们要加的括号就是这样

a1/(a2/a3/.../an)

然后如何判断能否使最终结果变为整数呢?只需要判断(a3,a4...an)这些数中是否含有a2的全部因子,具体做法:从a1扫到an,每个数(当然除了a2)分别与a2约去他们的最大公因数,an约分结束,a2能变为1,那就是能使最终结果变为整数,反之不能。

posted @ 2017-09-18 08:52  Excim  阅读(246)  评论(0编辑  收藏  举报