这周又是一个忙碌的一周,除了必要的课程和工作以外,还在学习暑假落下的算法课程,以及差了一点的c++。
周四在codeforces上有比赛,但是不知道为啥宿舍网断了,开手机热点结果卡的要死,加载出来的题中的字母都是带着latex那样的,看着也不清楚,在最后几分钟它终于加载出来,结果没做上啥就到时间了……决定等大佬们出题解之后看看。
周六那天听同学的讲课也受益匪浅,把一些重要的经常用的函数等进行了总结与讲解。给同学们了一些使用的模板。
一般筛法(埃拉托斯特尼筛法,之后简称为埃筛):
基本思想:素数的倍数一定不是素数
实现方法:用一个长度为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同余是整数的一个等价关系。
还不是特别懂它的意义何在,决定再找点书或者资料看一下。
下周又要学习新的知识了,加油!!