zoukankan      html  css  js  c++  java
  • 集训笔记——质数筛法

    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个
  • 相关阅读:
    legend2---开发日志12(vue如何进一步学习)
    为什么现在的年轻人生育的欲望越来越低?(转自知乎)
    legend2---开发日志13(layer_mobile的content传入dom 出现【object object】如何解决)
    legend2---项目总结(legend2的意义)
    legend2---开发日志11(如何提高终极开发效率)
    公司项目架构的演变过程(转)
    创业公司如何实施敏捷开发(敏捷开发简单流程)(转)
    创业公司一年工作总结(转)(公司失败原因)
    LayaAir引擎开发HTML5最简单教程(面向JS开发者)
    [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)
  • 原文地址:https://www.cnblogs.com/robertspot/p/12393066.html
Copyright © 2011-2022 走看看