容斥原理的定义
简介:
在计数时,必须注意没有重复,没有遗漏。
为了使重叠部分不被重复计算,人们研究出一种新的计数方法,
这种方法的基本思想是:
先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,
然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,
这种计数的方法称为容斥原理。
例题1 区间整除数
给出一个数组 a [ 1.. n ] a[1..n] a[1..n],问在区间 [ L , R ] [L,R] [L,R]中有多少个数,至少能被a中的一个数整除。
输入格式
多组测试数据。
第一行,一个整数 G G G,表示有 G G G组测试数据。 1 < = G < = 10 1 <= G <= 10 1<=G<=10
每组测试数据格式:
第一行,三个整数, N N N, L L L, R R R。 1 < = L < = R < = 1 0 9 1 <= L<=R <= 10^9 1<=L<=R<=109, $ 1<=N<=18$。
第二行, N N N个整数,第 i i i个整数是 a [ i ] a[i] a[i]。 $ 1 <= a[i] <= 10^9$。
输出格式
共 G G G行,每行一个整数。
输入
8
1 293 784
1
1 255 734
2
2 579000 987654
1 2
2 1 1000000000
2 3
3 1 1000000000
2 3 5
18 1 1000000000
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 49 53 59
2 1956 9013
307 419
5 8636 9586
5 367 487 463 167
输出
492
240
408655
666666667
733333334
866219330
40
200
分析
题目询问区间 [ l , r ] [l,r] [l,r] 可以转化为 [ 1 , r ] − [ 1 , l − 1 ] [1,r]-[1,l-1] [1,r]−[1,l−1]
此时我们只需求 [ 1 , m a x ] [1,max] [1,max]中有多少个数能至少被一个 a [ i ] a[i] a[i]整除即可
直接从枚举 [ 1 , m a x ] [1,max] [1,max]必然会超时
于是考虑如下方法:
我们可以算 [ 1 , m a x ] [1,max] [1,max]中有多少个数会被 a [ 1 ] a[1]