zoukankan      html  css  js  c++  java
  • 【模板】质数判断(欧拉筛法)

    题意简述

    给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)

    题解思路

    对于任意合数,必定可以有最小质因子乘以最大因子的分解方式。
    因此,对于每个合数,只要用最大因子筛一遍,枚举时只要枚举最小质因子即可。

    代码

    #include <cstdio>
    using namespace std;
    const int t[5] = {0, 2, 7, 61};
    int n, m, x;
    int ksm(int a, int r, int mod)
    {
        if (r == 0)
            return 1;
        if (r == 1)
            return a;
        int x = ksm(a, r >> 1, mod) % mod;
        if (r & 1)
            return ((long long) x * x) * a % mod;
        else return ((long long) x * x) % mod;
    }
    bool mr(int x)
    {
        if (x == 1) 
            return 0;
        int cnt = 0, p1 = x - 1;
        while (p1 % 2 == 0)
        {
            ++cnt;
            p1 /= 2;
        }
        for (int i = 1; i <= 3; ++i)
        {
            if (x == t[i])
                return 1;
            int xx = ksm(t[i], p1, x);
            if (xx % x != 1 && xx % x != x - 1)
            {
                bool flag = 0;
                for (int j = 1; j <= cnt; ++j)
                {
                    xx = (long long) xx * xx % x;
                    if (xx == x - 1)
                    {
                        flag = 1; 
                        break;
                    }
                }
                if (!flag)
                    return 0;
            } 
        }
        return 1;
    }
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; ++i)
        {
            scanf("%d", &x);
            if (mr(x)) puts("Yes");
            else puts("No");
        }
    }
    
  • 相关阅读:
    layui镜像站文档
    mysql 查询 包含哪个字符串
    laydate时间点击后马上消失
    timer_dma_enable
    map文件堆栈大小
    回调函数
    复位电路
    stm32 map文件的分析
    如何在VSCode里面写代码进行调试和运行
    DMA为CPU减负
  • 原文地址:https://www.cnblogs.com/xuyixuan/p/9425148.html
Copyright © 2011-2022 走看看