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

题意:给定一个数,判断是不是素数。

析:由于数太多,并且太大了,所以以前的方法都不适合,要用米勒拉宾算法。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <map>
#include <cctype>

using namespace std;
typedef long long LL;
const int maxn = 1000 + 5;

LL qpow(int a, int b, int r){
    LL ans = 1;
    LL k = a % r;
    while(b){
        if(b & 1)  ans = (ans * k) % r;
        k = (k * k) % r;
        b >>= 1;
    }
    return ans;
}

bool miller_rabbin(int n, int a){
    int r = 0,s = n-1;
    if(!(n % a))  return false;
    while(!(s & 1)){  s >>= 1;  ++r; }

    LL k = qpow(a, s, n);
    if(1 == k)  return true;
    for(int j = 0; j < r; ++j, k = k * k % n)
        if(k == n-1)  return true;
    return false;
}

bool is_prime(int n){
    int tab[] = {2, 3, 5, 7};
    for(int i = 0; i < 4; ++i){
        if(n == tab[i])  return true;
        if(!miller_rabbin(n, tab[i])) return false;
    }
    return true;
}

int main(){
//    freopen("in.txt", "r", stdin);
    int n, x;
    while(~scanf("%d", &n)){
        int cnt = 0;
        for(int i = 0; i < n; ++i){
            scanf("%d", &x);
            if(is_prime(x))  ++cnt;
        }
        printf("%d\n", cnt);
    }
}
时间: 2024-10-25 21:15:48

HDU 2138 How many prime numbers (判素数,米勒拉宾算法)的相关文章

HDu 2138 How many prime numbers 高效Miller素数测试

题目就是给出一组数,让我们测试其中有多少个是素数. 求素数有测试sqrt(n)个数的方法,有筛子方法,不过对于本题这样的题目来说就都不是高效的. 本题使用Miller Rabin素数测试法,效率奇高,对于不是极其大的整数测试都几乎是常数时间.令人神往的算法啊. 网上有个程序,好像是什么吉林的模板程序,不过我一直没看懂他是什么思路写的,是个AC的程序,不过却是错误的,呵呵,因为程序一直把9当做素数. 于是上网查找了其中原理,自己写了个程序,效率和他的差不多一样,通过时间基本无差别,不过我的思路是按

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/Others)Total Submission(s): 12955    Accepted Submission(s): 4490 Problem Description Give you a lot of positive integers, just to find out how many pr

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

Problem Description Give you a lot of positive integers, just to find out how many prime numbers there are. Input There are a lot of cases. In each case, there is an integer N representing the number of integers to find. Each integer won't exceed 32-

HDu 2138 How many prime numbers 高效Miller素数測试

题目就是给出一组数.让我们測试当中有多少个是素数. 求素数有測试sqrt(n)个数的方法.有筛子方法,只是对于本题这种题目来说就都不是高效的. 本题使用Miller Rabin素数測试法.效率奇高.对于不是极其大的整数測试都差点儿是常数时间.令人神往的算法啊. 网上有个程序,好像是什么吉林的模板程序,只是我一直没看懂他是什么思路写的,是个AC的程序,只是却是错误的,呵呵,由于程序一直把9当做素数. 于是上网查找了当中原理,自己写了个程序,效率和他的几乎相同一样.通过时间基本无区别,只是我的思路是

HDU 2138 How many prime numbers

就是找素数. 非常水的题.模糊搜索一道题搜到的. 可是却 TLE 2次.把全部的 long long 改成 int ,%lld 改成 %d 就奇妙的过了. 简直不可思议. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include&

HDU 4910 Problem about GCD(米勒拉宾)

HDU 4910 Problem about GCD 题目链接 题意:给定一个数字,求出1 - n之间与他互质的数的乘积mod n 思路:看了网上别人找出来的规律,原文链接 然后由于这题的n很大,也没法直接判定,可以这样搞,先去试10^6以内的素数,判断可不可以,如果不行,再利用米勒拉宾判下是否是素数,如果不是的话,把这个数字开根在平方,判断是不是完全平方数,这样做的原因是数字最大10^18,如果没有10^6以内的质因子,又不是质数的话,那么他最多只能包含2个质因子了,那么如果他不是一个完全平方

csu 1552(米勒拉宾素数测试+二分图匹配)

1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 723  Solved: 198[Submit][Status][Web Board] Description On an alien planet, every extraterrestrial is born with a number. If the sum of two numbers is a prime number, then two extraterrestr

POJ 1811Prime Test(米勒拉宾素数测试)

直接套用模板,以后接着用 这里还有一个素因子分解的模板 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <vector> 8 #include <cstdio> 9 #include <cctype> 10

Miller_Rabin(米勒拉宾)素数测试

2018-03-12 17:22:48 米勒-拉宾素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数.卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义黎曼猜想的确定性算法,由于广义黎曼猜想并没有被证明,其后由以色列耶路撒冷希伯来大学的Michael O. Rabin教授作出修改,提出了不依赖于该假设的随机化算法. 问题描述:对于大整数N,判断其是否为素数. 问题求解: 若N为偶数,直接返回false,若N是奇数,则进行以下几步进行判断: 将N -