题目传送门

sol1:普通判到sqrt(n)的素数判定,不多说了。

  • 素数判定

    #include "bits/stdc++.h"
    using namespace std;
    bool is_prime(int n) {
    for (int i = ; 1LL * i * i <= n; i++)
    {
    if (n % i == ) return false;
    }
    return true;
    }
    int main() {
    int n, m;
    while (~scanf("%d", &n)) {
    int cnt = ;
    for (int i = ; i <= n; i++) {
    scanf("%d", &m);
    if (is_prime(m)) cnt++;
    }
    printf("%d\n", cnt);
    }
    return ;
    }

    复杂度sqrt(m),判断n次就是n * sqrt(m);

sol2:新get到的技巧Miller-Rabin素数测试,结合了费马小定理和二次探测定理,可以更高效的判断素数,存在误判可能,不过误判可能非常小,可以忽略不计;

  • Miller-Rabin素数测试

    #include "bits/stdc++.h"
    using namespace std;
    int quick_pow(int n, int k, int p) {
    int ans = ;
    while (k) {
    if (k & ) ans = 1LL * ans * n % p;
    n = 1LL * n * n % p;
    k >>= ;
    }
    return ans;
    }
    bool is_prime(int n) {
    // if (n < 2) return false;
    int s = , t = n - ;
    while (!(t & )) s++, t >>= ;
    for (int i = ; i <= ; i++) {
    int a = rand() % (n - ) + ;
    int k = quick_pow(a, t, n);
    for (int j = ; j <= s; j++) {
    int x = 1LL * k * k % n;
    if (x == && k != && k != n - ) return false;
    k = x;
    }
    if (k != ) return false;
    }
    return true;
    }
    int main() {
    int n, m;
    srand(time(NULL));
    while (~scanf("%d", &n)) {
    int cnt = ;
    for (int i = ; i <= n; i++) {
    scanf("%d", &m);
    if (is_prime(m)) cnt++;
    }
    printf("%d\n", cnt);
    }
    return ;
    }

    复杂度logm,判断n次就是n * log(m);

附加一个用于 LL 范围素数测试的模板:s

  • Miller-Rabin素数测试 LL 范围模板

    typedef long long LL;
    LL quick_mul(LL n, LL k, LL p) {
    LL ans = ;
    while (k) {
    if (k & ) ans = (ans + n) % p;
    n = (n + n) % p;
    k >>= ;
    }
    return ans;
    }
    LL quick_pow(LL n, LL k, LL p) {
    LL ans = ;
    while (k) {
    if (k & ) ans = quick_mul(ans, n, p);
    n = quick_mul(n, n, p);
    k >>= ;
    }
    return ans;
    }
    bool is_prime(LL n) {
    if (n < ) return false;
    LL s = , t = n - ;
    while (!(t & )) s++, t >>= ;
    for (int i = ; i <= ; i++) {
    LL a = rand() % (n - ) + ;
    LL k = quick_pow(a, t, n);
    for (int j = ; j <= s; j++) {
    LL x = quick_mul(k, k, n);
    if (x == && k != && k != n - ) return false;
    k = x;
    }
    if (k != ) return false;
    }
    return true;
    }

    大致差不多,为了防止爆 LL 加了一个快速积用于乘, 所以复杂度变成了log(m) * log(m)

HDU-2138-How many prime numbers(Miller-Rabin新解法)的更多相关文章

  1. HDOJ(HDU) 2138 How many prime numbers(素数-快速筛选没用上、)

    Problem Description Give you a lot of positive integers, just to find out how many prime numbers the ...

  2. HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )

    How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  3. HDU 2138 How many prime numbers

    米勒罗宾素数测试: /* if n < 1,373,653, it is enough to test a = 2 and 3. if n < 9,080,191, it is enoug ...

  4. HDU 2138 How many prime numbers (判素数,米勒拉宾算法)

    题意:给定一个数,判断是不是素数. 析:由于数太多,并且太大了,所以以前的方法都不适合,要用米勒拉宾算法. 代码如下: #include <iostream> #include <c ...

  5. 【HDU】2138 How many prime numbers

    http://acm.hdu.edu.cn/showproblem.php?pid=2138 题意:给n个数判断有几个素数.(每个数<=2^32) #include <cstdio> ...

  6. hdu 5108 Alexandra and Prime Numbers(水题 / 数论)

    题意: 给一个正整数N,找最小的M,使得N可以整除M,且N/M是质数. 数据范围: There are multiple test cases (no more than 1,000). Each c ...

  7. hdu 5108 Alexandra and Prime Numbers

    数论题,本质是求出n的最大质因子 #include<time.h> #include <cstdio> #include <iostream> #include&l ...

  8. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  9. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  10. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

随机推荐

  1. split和join合写

    小骆驼 第一章 简介 1. // input 和截取字符 #!usr/bin/perl use strict; use warnings; while ( <> ) { chomp; pr ...

  2. 36. docker swarm docker secret 的使用和管理

    1.secret management 的作用 用来存储 其他人不想看到 的数据 2.secret management 存在 swarm manager 节点 raft database 里. se ...

  3. 35. docker swarm dockerStack 部署 投票应用

    1. 编写 docker-compose.yml # docker-compose.yml version: "3" services: redis: image: redis:a ...

  4. 基于迅为-i.MX6Q开发板制作镜像方法

    在“/home/imx6”目录(在前面编译 android 系统的时候新建过这个目录,如果没有可以自己新建一个)下,使用命令“mkdir minilinux/”新建 minilinux 目录,使用命令 ...

  5. storm 机制

    storm基础系列之二----zookeeper的作用 https://www.cnblogs.com/xyang/p/5643745.html Zookeeper+Storm集群搭建 https:/ ...

  6. Android json数据Log格式化打印

    https://blog.csdn.net/adarcy/article/details/76601896 public static final String LINE_SEPARATOR = Sy ...

  7. [Typora ] LaTeX公式输入

    [Typora 笔记] 数学输入整理 1.希腊字母表 大写 md 小写 md \(A\) A \(\alpha\) \alpha \(B\) B \(\beta\) \beta \(\Gamma\) ...

  8. 模板编程里class 与 typename 的区别

    大部分情况下可以相互替换,但是某些情况class 无法替代typename,例如 template< class T, class U > std::shared_ptr<T> ...

  9. ifconfig筛选出IP

    ifconfig     |grep inet    |awk -F: 'NR==1{print}'     |awk  '{print $2}'

  10. 吴裕雄--天生自然 JAVA开发学习:接口

    [可见度] interface 接口名称 [extends 其他的接口名] { // 声明变量 // 抽象方法 } import java.lang.*; //引入包 public interface ...