zoukankan      html  css  js  c++  java
  • 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
    ", cnt);
        }
    }
    
  • 相关阅读:
    疲劳的一天
    Singleton模式与对象池的假设....
    没有杀死我的 (创伤心理学简介)
    Python深入03 对象的属性
    协议森林14 逆袭 (CIDR与NAT)
    Python深入05 装饰器
    协议森林06 瑞士军刀 (ICMP协议)
    数据可视化的秘密
    协议森林
    协议森林13 9527 (DNS协议)
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5557082.html
Copyright © 2011-2022 走看看