当前位置: 代码迷 >> 综合 >> 2020-09-27大二第四周
  详细解决方案

2020-09-27大二第四周

热度:79   发布时间:2024-02-23 08:35:12.0

这周又是一个忙碌的一周,除了必要的课程和工作以外,还在学习暑假落下的算法课程,以及差了一点的c++。

周六那天听同学的讲课也受益匪浅,把一些重要的经常用的函数等进行了总结与讲解。给同学们了一些使用的模板。

一般筛法(埃拉托斯特尼筛法,之后简称为埃筛):

基本思想:素数的倍数一定不是素数

实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数) 先假设所有的数都是素数(初始化为0) 从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N; 然后进行下一趟,找到2后面的下一个素数3,进行同样的处理 直到最后,数组中依然为0的数即为素数。

线性筛法(欧拉筛法):

我们发现在上面的筛法中有的数字是多个素数的倍数,也就是说它可能会被重复计算多次,比如说6同时是2与3的倍数,它在计算时就被访问了两次,这样会导致效率低下,所以在下面的算法中我们考虑如何优化这种情况。

原理:

任何一个合数都可以表示成一个质数和一个数的乘积

假设A是一个合数,且A = x * y,这里x也是一个合数,那么有:

A = x * y; (假设y是质数,x合数)

x = a * b; (假设a是质数,且a < x——>>a < y)

-> A = a b y = a Z (Z = b y)

即一个合数(x)与一个质数(y)的乘积可以表示成一个更大的合数(Z)与一个更小的质数(a)的乘积,那样我们到每一个数,都处理一次,这样处理的次数是很少的,因此可以在线性时间内得到解。

算数基本定理:

算术基本定理:任何一个大于 1 的自然数可以分解成一些素数的乘积;并且在不计次序的情况下,这种分解方式是唯一的。

同余:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。

还不是特别懂它的意义何在,决定再找点书或者资料看一下。

下周又要学习新的知识了,加油!!