问题简述:
有1~n个灯泡,每个灯泡都有一个开关,每个灯泡初始都是不亮的。分别进行三次操作,每次操作都选择一个素数x,将编号为x和x的整数倍所对应的灯泡开关都拨动一下(如果原来的灯是亮的则拨动后为不亮,若刚开始不亮,拨动后为亮)。求出最后亮着的灯泡个数
假设n=10.
容斥定理:
在不考虑重叠的情况下,计算出所有被并集合的元素数,然后再把计数时重复计算的元素数排斥出去,使得计算结果既无重复也无遗漏。这种计数方法叫做容斥定理。
本题中,第一步:2及2的倍数:2,4,6,8,10亮;第二步:3,,,3和9会亮,但是2和3的倍数6会灭;第三步,5,,,5亮,2,5的倍数会灭。
从文氏图中看,即为求阴影部分的元素数量 。
计算公式思考:
n,1~n中2的倍数有 n/2个,2和3的倍数有n/2/3个,2 3 5的倍数有n/2/3/5个,但是4 6的倍数有n/4/6*2个。总结出来,要求几个数的倍数的个数,就用n除以这几个数的最小公倍数。
①把每个倍数的个数都加起来。
②将它们两两重叠的部分-2次(多加了一次,但是开关开一次再关一次就等于没开,算的是亮着的个数,所以-2)。
③将他们三个重叠的部分+4次(在将每个倍数的个数都加起来的时候,他们三个重叠的部分就先+3。将两两重叠的部分减去的时候,有三个两两重叠的部分,又-6,所以1、2步合起来一共是-3。而这部分是亮的,应该加到最后的结果中去,所以+4 三个重叠的部分=1)
得出结果:
ans= n /a + n / b + n / c - 2 *[ n / lcm (a,b) + n / lcm (a,c) + n / lcm (b,c) ] + 4 *[ n / lcm (a,lcm(b,c))]