集训笔记——质数筛法

2020年3月1日更新

开课先讲了讲昨天留的题目:

https://nanti.jisuanke.com/t/43512
• 给出n个酒桶在坐标轴的位置,要求通过移 动一些酒桶,使得每个酒桶之间的距离为k。 
• 求最小移动距离
• (另外这题评测机跑的飞快,你可以认为 1s1e8)
1≤N,K≤10^6

分析及题解:

课件内容:
https://nanti.jisuanke.com/t/43512 • 给出n个酒桶在坐标轴的位置,要求通过移 动一些酒桶,使得每个酒桶之间的距离为k。 • 求最小移动距离 • 不难发现第一个酒桶的位置可以三分得到。 • 本题做完。 • 不是很难吧。

(敬请期待三分O(n*logn)做法及O(n)做法以后整理)

然后今天讲了讲以前就会的用来筛质数的埃氏筛和欧拉筛(线性筛)

然后就开始讲题了

由于以前讲过埃氏筛和欧拉筛并且二者比较简单所以也就不讲了

讲一下上节课的几道题:

1.POJ2142:The Balanc

原题:

有一天平和两种数量无限的砝码(重为a和 b),天平左右都可以放砝码,称质量为c 的物品,要求:放置的砝码数量尽量少; 当砝码数量相同时,总质量尽量小。

课件分析:

• 本质不就是ax+by=c吗,然后求|x|+|y|最小 且|ax|+|by|最小的可行解。 
• 不难想到可能满足第一条的只有x正整数最 小解和y正整数最小解这两种解,其中一个 就是答案。

2.POJ2115:C Looooops

原题:

for(i=A;i!=B;i+=C){i%=1<<k;}问会循环多少 次(有可能死循环)

课件分析:

• 和跳青蛙差不多 
• 设a=C,b=(1<<k),c=(B-A). 
• 则ax+by=c.

然后正式开始讲筛法了:

讲题:

1.POJ2689:Prime Distance

原题:

给不超过int的l,r,其中r-l+1<=1e6,筛出 其中的素数,并且求出相邻素数差值最大 和最小的一对。

课件内提示:

提示:区间内的合数的质因子一定有在 50000以内的

反证法证明该提示:假设质因数都大于50000,但5e4*5e4=2.5e9,int的范围最大为2.1e9。所以在int范围内一定不存在所有质因数都大于50000的合数。

• 筛出50000以内的素数,用它们来筛出[l,r] 内的合数。 
• 怎么筛是个问题,假设我们有一素数p(并 且筛完了素数p以前所有素数的倍数),我 们显然希望找到第一个在区间内的素数的 倍数,然后用筛法筛区间内的合数即可。 
• 显然p*p是一个没被筛过的合数,如果p*p<l 那么我们第一个筛的合数就应该是(l+p- 1)/p*p
• 显然p*p是一个没被筛过的合数,如果p*p<l 那么我们第一个筛的合数就应该是(l+p- 1)/p*p. 
• 如果l<=p*p<=r那么第一个筛的合数就是p*p 
• 如果p*p>r那就不用筛了。 
• 然后对第一个筛的合数不断+p直到超过r, 然后这些合数全筛走,剩下的就是质数。 
• 其余细节也有很多,很有必要一写。

2.POJ3421:X-factor Chains

原题:

构造一个数列,起始为1,终止为一给定数 X,满足Xi < Xi+1 并且Xi | Xi+1。求出数列 最大长度和该长度下的情况数。(X<2^20

课件讲解:

• 将X分解质因数(假设有n个),要想最长 显然它前面那个数是n-1个质因数相乘,那 么再前面的那个数是n-1中n-2个质因数相 乘……以此类推,长度就是n+1(题要求输 出此数-1)
• 方案数就是有重元素的排列了 
• 什么,你不会怎么求

方案数就是n!/(a1!*a2!*......*ai!)

3.CF449C:Jzzhu and Apples

原题:

有数1~n,要求配对,每对最大公约数不能 为1,求最大配对数。(n<=1e5

课件讲解:

• 贪心,显然有大素数因子的数难配对,于 是从大到小枚举素数p,那么p,2*p,3*p…… 都可以两两配对(前提是这个数没被配过) 
• 如果是奇数个肯定要扔掉一个数。 
• 把2*p扔掉,然后这些扔掉的数到了p=2的 时候就会自己互相配对啦。 
• 不难发现我们最大化利用了每个数。

课上题目都讲完了!

(事实证明我是个莫得感情的课件搬运工)

课后题目:

1.lgP2758 编辑距离

• 设A和B是两个字符串。我们要用最少的字
符操作次数,将字符串A转换为字符串B。
这里所说的字符操作共有三种:
• 1、删除一个字符;
• 2、插入一个字符;
• 3、将一个字符改为另一个字符;
• !皆为小写字母!

2.

https://nanti.jisuanke.com/t/43511 
• 给两个由a~z和0~9组成的字符串,你可以 对任意一个字符串做如下操作: 
• 在一个地方插入一个字母 
• 删除一个字母 
• 删除一个数字k,然后在此处插入k个字母 
• 问最少几步使得两个字符串相同且没有数 字存在? 
• 第一个字符串长10000,第二个长1000, 数字最多100个

猜你喜欢

转载自www.cnblogs.com/robertspot/p/12393066.html