首页 > 其他分享 >「AcWing学习记录」质数

「AcWing学习记录」质数

时间:2023-02-12 01:44:37浏览次数:66  
标签:记录 int 质数 cfrac pj include 复杂度 AcWing

AcWing 866. 试除法判定质数

原题链接

时间复杂度\(O(\sqrt{n})\)

\[d|n\implies\cfrac{n}{d}|n \]

\[d\leq\cfrac{n}{d}\implies d^2\leq n\implies d\leq \sqrt{n} \]

#include<iostream>
#include<algorithm>

using namespace std;

bool is_prime(int n)
{
    if(n < 2) return false;
    for(int i = 2; i <= n / i; i++)
        if(n % i == 0)
            return false;
    return true;
}

int main()
{
    int t;
    scanf("%d", &t);

    while(t--)
    {
        int a;
        scanf("%d", &a);
        if(is_prime(a)) puts("Yes");
        else puts("No");
    }

    return 0;
}

AcWing 867. 分解质因数

原题链接

时间复杂度介于\(O(\log{n})\)和\(O(\sqrt{n})\)之间

#include<iostream>
#include<algorithm>

using namespace std;

void divide(int n)
{
    for(int i = 2; i <= n / i; i++)
        if(n % i == 0) //i一定是质数
        {
            int s = 0;
            while(n % i == 0)
            {
                n /= i;
                s++;
            }

            printf("%d %d\n", i, s);
        }

    if(n > 1) printf("%d %d\n", n, 1); //n中最多只包含一个大于sqrt(n)的质因子,可通过反证法证明
    puts("");
}

int main()
{
    int t;
    scanf("%d", &t);

    while(t--)
    {
        int a;
        scanf("%d", &a);

        divide(a);
    }

    return 0;
}

AcWing 868. 筛质数

原题链接

对于一个大于2的正整数p,如果p没有被筛掉,那么说明p不是2到p-1中任何一个数的倍数,即2到p-1中没有一个数是p的约数。

朴素筛法的时间复杂度计算

\[\cfrac{n}{2} + \cfrac{n}{3} + \cdots + \cfrac{n}{n} = n(\cfrac{1}{2} + \cfrac{1}{3} + \cdots + \cfrac{1}{n}) \]

\[\lim_{n \to \infty}(\cfrac{1}{2} + \cfrac{1}{3} + \cdots + \cfrac{1}{n}) = \ln n + C \]

C为欧拉常数,约为0.577

\[n\ln n < n\log_{2}{n} \]

时间复杂度可以记成\(O(n\log n)\)


埃氏筛法的时间复杂度计算
质数定理:1~n中有\(\cfrac{n}{\ln n}\)个质数

\[n(\cfrac{1}{2} + \cfrac{1}{3} + \cdots + \cfrac{1}{n}) = n\ln n / \ln n = O(n) \]

而真实的时间复杂度为\(O(n\log \log n)\)


线性筛法的原理
1.i % pj == 0
pj一定是i的最小质因子,pj一定是pj * i的最小质因子
2.i % pj != 0
pj一定小于i的所有质因子,pj也一定是pj * i的最小质因子

对于一个合数x,假设pj是x的最小质因子,当i枚举到x/pj的时候一定会被筛掉,所以任何一个合数都会被筛掉,并且只用最小质因子来筛,每个数只有一个最小质因子,所以每个数只会被筛一次,所以是线性的。

//朴素筛法
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1000010;

int primes[N], cnt;
bool st[N];

void get_primes(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!st[i])
        {
            primes[cnt++] = i;
        }
        for(int j = i + i; j <= n; j += i) st[j] = true;
    }
}

int main()
{
    int n;
    scanf("%d", &n);

    get_primes(n);

    printf("%d\n", cnt);
}

//由于只有质数的倍数才需要筛掉,所以可以将筛选的循环放到判断里面去

//埃氏筛法
void get_primes(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!st[i])
        {
            primes[cnt++] = i;
            for(int j = i + i; j <= n; j += i) st[j] = true;
        }
    }
}

//埃氏筛法是筛掉质数的倍数,但仍会重复计算,线性筛法中每个合数只会被其最小质因子筛掉,解决了重复计算的问题

//线性筛法
void get_primes(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!st[i]) primes[cnt++] = i;
        for(int j = 0; primes[j] <= n / i; j++)
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}

标签:记录,int,质数,cfrac,pj,include,复杂度,AcWing
From: https://www.cnblogs.com/YuukiAsuna/p/17112621.html

相关文章

  • 【记录】对高考成绩的判断
    1.当我高考成绩越好,我父母对我的看法会改变,对我的支持增加,大概率支持我休学创业。2.越好的高考成绩,学校越好,创业不成后多一条退路。3.社会目前大多数人看一个人是否有能......
  • win11配置wsl2的记录
    介绍适用于Linux的Windows子系统(WSL)可让开发人员直接在Windows上按原样运行GNU/Linux环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或......
  • 周做题记录 #3
    有没有群巨教我怎么出题啊/llP6943[ICPC2018WF]ConquerTheWorldAnalysis题解Solution还有两种做法。一种做法是线段树模拟费用流,如CTSC2010产品销售一样,每次加......
  • 012k8s node oom记录
    一、腾讯云事件总线报警(1)根据如下报警,如何查看受影响的应用及处理:云服务产品告警通知尊敬的腾讯云用户,您好!您的腾讯云账号(账号ID:xxx)云服务服务产品云服务器事......
  • 「AcWing学习记录」并查集
    并查集1.将两个集合合并2.询问两个元素是否在一个集合当中时间复杂度近乎O(1)基本原理每个集合用一棵树来表示。树根的编号就是整个集合的编号,每个节点存储它的父节点......
  • AcWing 第 90 场周赛 ABC
    (我又来水博客了)才五天没写题,打成这样子,会被自己气shahttps://www.acwing.com/activity/content/2870/AcWing4806.首字母大写#include<bits/stdc++.h>usingnamespa......
  • 前端复习题记录
    异步操作有哪些?回调函数,事件监听,promise,ajax,async,setTimeout,GeneratorPromise是什么?Promise是异步编程的一种解决方案。从语法上讲,promise是一个对象,通过它可以......
  • HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(3) ---真机调试(实例
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • HISI3520DV300 折腾记录(二)之《内存映射、存储(DDRC,FMC)、启动模式分析》
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • HISI3520DV300 折腾记录(三)之《终篇》
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......