首页 > 其他分享 >[第326场周赛]分解质因数,埃氏筛,欧拉筛

[第326场周赛]分解质因数,埃氏筛,欧拉筛

时间:2023-01-01 15:31:42浏览次数:63  
标签:prime 周赛 埃氏 range 素数 num 326 primes 质因数

leetcode新年福利,本次周赛没有Hard难度的题目,然后我就第一次AK了~

总的来说不是很难,涉及到了三个算法,在此记录一下。

分解质因数

题目链接:​​6279. 数组乘积中的不同质因数数目​

实际上本题就是求数组中每个元素的质因数,并扔到哈希表中进行去重。

所以唯一难点即是如何将一个数进行质因数分解。

方法:从2开始,如果该数可以整除2,那么就将该数除以2,再除以2,……直到无法整除之后,将除数2变成3,重复上述操作。

注意由于每一次操作都除掉了所有的因子,所以不用担心后续会将合数误判为质因数的情况,非常巧妙。

模板(Python)

n = NUM # 待分解的数
s = set() # 存储所有质因数的哈希表
x = n
i = 2
while i*i <= x:
while x%i == 0:
s.add(i)
x //= i
i += 1

埃氏筛

题目链接:​​6280. 范围内最接近的两个质数​

初中就学过的简单算法。不再赘述。

模板(Python)

def sieve_of_eratosthenes(n):  # 埃拉托色尼筛选法,返回小于等于n的素数
primes = [True] * (n + 1) # 范围0到n的列表
p = 2 # 这是最小的素数
while p * p <= n: # 一直筛到sqrt(n)就行了
if primes[p]: # 如果没被筛,一定是素数
for i in range(p * 2, n + 1, p): # 筛掉它的倍数即可
primes[i] = False
p += 1
primes = [element for element in range(2, n + 1) if primes[element]] # 得到所有小于等于n的素数
return primes

欧拉筛

埃氏筛的缺点在于一个数可能会被筛多次的情况,在数据范围n较大时可能具有较高的开销。因此,另一种欧拉筛(又称线性筛)应运而出。其思想是:每一个合数都只被它的lpf(最小质因数)筛掉。

因此,在筛的过程中,如果一个数被划掉了,即该数是合数,那么只需要划掉(或者划至,下面的模板就是划至)其lpf乘以自身的那个数;如果该数是质数,即尚未被筛,那么就全都要划。

模板(Python)

def euler_flag_prime(n):
# 欧拉线性筛素数,返回小于等于n的所有素数
flag = [False for _ in range(n + 1)]
prime_numbers = []
for num in range(2, n + 1):
if not flag[num]:
prime_numbers.append(num)
for prime in prime_numbers:
if num * prime > n:
break
flag[num * prime] = True
if num % prime == 0:
break
return prime_numbers

开年AK,开心。也希望自己2023年的Resolutions都能实现,每件事情都能持之以恒地做下去!



标签:prime,周赛,埃氏,range,素数,num,326,primes,质因数
From: https://blog.51cto.com/u_15763108/5983026

相关文章

  • ACWING 第 84 场周赛 ABC
    来水一篇博客:)https://www.acwing.com/activity/content/competition/problem_list/2742/难度偏低(三题都cf800的难度),就不写详解了4788.最大数量#include<bits/stdc++......
  • LeetCode第 94 场双周赛
    1.最多可以摧毁的敌人城堡数目题目最多可以摧毁的敌人城堡数目Solution可以第一重循环找到\(1\),然后从该位置分别向左和向又寻找\(-1\),寻找过程中遇到\(1\)则停止,不......
  • LeetCode周赛325
    到目标字符串的最短距离题目SolutionclassSolution{public:intclosetTarget(vector<string>&words,stringtarget,intstartIndex){intn=wo......
  • 第323场周赛-第三题
    给你一个整数n,表示下标从0开始的内存数组的大小。所有内存单元开始都是空闲的。请你设计一个具备以下功能的内存分配器:分配一块大小为size的连续空闲内存单元并赋......
  • 第323场周赛-第二题
    给你一个整数数组nums。如果nums的子序列满足下述条件,则认为该子序列是一个方波:子序列的长度至少为2,并且将子序列从小到大排序之后,除第一个元素外,每个元素都是......
  • leetcode笔记——323周赛
    2503.矩阵查询可获得的最大分数-力扣(LeetCode)这道题我选用BFS+优先队列来做,(并查集太难了不打算掌握了)。。。优先队列和普通队列的差别就在于:存到队列中的位置与存的......
  • leetcode笔记——325周赛
    2515.到目标字符串的最短距离-力扣(LeetCode)这道题一次遍历就可以做,直接用abs(i-startindex)和n-abs(i-startindex)即可表示距离,但我做的时候绕麻烦了......
  • AcWing83场周赛题解
    第一题、奇偶题目链接:https://www.acwing.com/activity/content/problem/content/7862/比较麻烦(本人做法)找出不同字符个数,再判断。#include<iostream>usingnamespac......
  • Acwing 第 83 场周赛 ABC
    https://www.acwing.com/activity/content/competition/problem_list/2714/4785.奇偶题目大意:给定一个字符串,问我们去重后单词数是奇是偶?输入样例1:wjmzbmr输出样......
  • leetcode笔记——324周赛
    第三题中设置字典:G = defaultdict(set)这样默认每个item是个set,可以直接用G[i].add(),不用G.get()再判断了第三题中有个判断:return any(i != x and i!=y and......