1. 程式人生 > >(luogu題解搬運系列)luogu p2651 添加括號Ⅲ

(luogu題解搬運系列)luogu p2651 添加括號Ⅲ

一個表 pre 之前 現在 結束 然而 希望 表達 不能

題目描述

現在給出一個表達式,形如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,那就是能使最終結果變為整數,反之不能。

(luogu題解搬運系列)luogu p2651 添加括號Ⅲ