【NOIP2013初賽】整除

題目描述:

Description

給出n個數a1,a2……an,求區間[L,R]中有多少個整數不能被其中任何一個數整除。

Input

第一行三個正整數,n,L,R。

第二行n個正整數a1,a2……an

Output

一個數,即區間[L,R]中有多少個整數不能被其中任何一個數整除。

Sample Input

2 1 1000

10 15

Sample Output

867

Data Constraint

對於30%的數據,1<=n<=10,1<=L,R<=1000

對於100%的數據,1<=n<=18,1<=L,R<=10^9
題解:

容斥原理。

答案相當於answer(r)-answer(l-1),這都是很簡單的套路了。

講講answer(x)怎麼求。

方法一:

這是我考場上想到的方法,看起來比較麻煩,理解也有點難度,感興趣的可以參考一下咯。

爲方便接下來的內容,我們先定義x1x2爲x/(gbs(x1,x2)),gbs表示兩個數的最小公倍數。

題目是求不能被整除的數,我們就用總數減去能被整除的數就好了。

先有一個a1,我們求1~x中能被a1整除的數,很顯然是x/a1。

再加入一個a2,我們求1~x中能被a1或a2整除的數,容斥原理很顯然再加上x/a2-a1a2。

再加入a3,顯然再加上x/a3-a1a3-a2a3+a1a2a3

再加入a4,顯然再加上x/a4-a1a4-a2a4-a3a4+a1a2a4+a1a3a4+a2a3a4-a1a2a3a4。

聰明可愛的孩子可以發現這是有規律的。

在插入a4的時候,再加上的值其實是a1,a2,a1a2,a3,a1a3,a2a3,a1a2a3這些數末尾加個a4,而這些數就是a1,a2,a3的容斥原理計算過程。

至於哪些是加哪些是減呢?

顯然我們可以發現奇數個是加,偶數個是減。

然後呢,發現這些規律後,我們就可以模擬做下去了。

方法二:

剛纔看別人總結時發現了一個更簡單的方法。

其實,只要dfs枚舉那n個數選還是不選,選奇數個答案就加上,選偶數個答案就減去。時間複雜度2^n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章