【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。

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