貌似是校内原创所以依然没有题面
题解
20pts
暴力枚举,时间复杂度为O(nm)。
60pts
首先读题,发现保证了ai>17。那么考虑,如果对于一个数n,满足n%b=17,且对于另一个数a满足b|a,一定满足n%a=17。(很容易证明,不多解释)
我们用num(x)表示在1~m的区间内对x取余等于17的数的个数。那么如果只有两个数:a1=a,a2=b,那么我们的答案应该是:
num(a)+num (b)-num(lcm(a,b))
这就是容斥思想了。
扩展一下,在三个数a,b,c的时候可以列出相仿的式子:
num(a)+num(b)+num(c )-num(lcm(a,b))-num(lcm(a,c))-num(lcm(b,c))+num(lcm(a,b,c))
那么n=3的40分就到手了~
100pts
其实呢……上面的式子在n更大的时候仍然成立,因为容斥原理是可以扩展的!
然后我们就搜索一下,枚举一下每个数选或不选。设最后选出了k个数,若k%2=0,我们就让答案减去m/lcm(选出的k个数),k%2=1,就让答案加上m/lcm(选出的k个数)。
当然仅仅是搜索还不够,我们还需要剪枝:
1、当前的lcm已经大于m,对答案贡献已经为0,因此回溯。
2、如果我们是搜到最后一位再一起处理,需要计算2m次扫描m个数及计算lcm,因此我们每搜一位就假设后面的都不选,把当前状态下的答案累加,再分别搜索这一位选或不选,这样可以省去不必要的计算。
有了上述优化就可以A掉啦~
总结
搜索是暴力拿分的神器之一,所以一定要尽可能剪枝来优化算法,跑快0.1s就可能多拿很多分啊。
当然首先我们要学好容斥否则根本不知道怎么搜