【日常练习】cost数 【组合数学】【搜索】

貌似是校内原创所以依然没有题面

题解

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就可能多拿很多分啊。

当然首先我们要学好容斥否则根本不知道怎么搜

发布了44 篇原创文章 · 获赞 16 · 访问量 7272

猜你喜欢

转载自blog.csdn.net/Cyan_rose/article/details/83628591
今日推荐