1. 程式人生 > >HDU 2138 How many prime numbers(米勒拉賓素數測試演算法)

HDU 2138 How many prime numbers(米勒拉賓素數測試演算法)

How many prime numbers

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7120    Accepted Submission(s): 2375


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-bit signed integer, and each of them won’t be less than 2. Output   For each case, print the number of prime numbers you have found out. Sample Input 3 2 3 4 Sample Output 2 Author wangye Source Recommend 威士忌 網上查了一下,這題要用相應的演算法解:miller_rabin演算法。學習下。。。

米勒拉賓素數測試,解大規模素數問題。
#include<iostream>
using namespace std ;
__int64 qpow(int a,int b,int r)
{
    __int64 ans=1,buff=a;
    while(b)
    {
        if(b&1)
            ans=(ans*buff)%r;
        buff=(buff*buff)%r;
        b>>=1;
    }
    return ans;
}
bool Miller_Rabbin(int n,int a)
{
    int r=0,s=n-1,j;
    if(!(n%a))
        return false;
    while(!(s&1))
    {
        s>>=1;
        r++;
    }
    __int64 k=qpow(a,s,n);
    if(k==1)
        return true;
    for(j=0;j<r;j++,k=k*k%n)
        if(k==n-1)
            return true;
    return false;
}
bool IsPrime(int n)
{
    int tab[5]={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()
{
    int n;
    while(~scanf("%d",&n))
    {
        int ans=0,a;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            if(IsPrime(a))
                ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}


相關推薦

HDU 2138 How many prime numbers素數測試演算法

How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7120  

千萬級高效簡便判斷是否為素數,若為合數,向左右搜尋最近的素數素數測試演算法

現在ZRain要讓n個孩子變成天使,每個孩子都有一個RP值,當RP值為一個質數時孩子就能變成天使。但是改變孩子的RP值是有代價的,比如rp從x改到y需要付出|x-y|的代價。ZRain真的太喜歡這些孩子了,他希望這些孩子都變成可愛的天使,但又希望付出最小的代價。   &nbs

hdu 2138(素數測試)

     How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Problem Description   Give

Miller_Rabin()素數測試

dir amp 可能 image 法則 卡內基 strong 概率 mod 2018-03-12 17:22:48 米勒-拉賓素性檢驗是一種素數判定法則,利用隨機化算法判斷一個數是合數還是可能是素數。卡內基梅隆大學的計算機系教授Gary Lee Miller首先提出了基於廣

算個尤函式給大家助助興判斷素數+Pollard_rho求一個大數的因子

這篇部落格講的很好: 題目描述 木南有一天學習了尤拉函式,知道了對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目。那麼他定義f(n)為有多少個小於等於n的數可以整除n。 例如f(4)=3。(可以被1,2,4整除)。 那麼你可以寫個程式計算一下f(n)嗎?

(模板)素數測試大數素數判斷&&搜尋離合數最近的素數

現在ZRain要讓n個孩子變成天使,每個孩子都有一個RP值,當RP值為一個質數時孩子就能變成天使。但是改變孩子的RP值是有代價的,比如rp從x改到y需要付出|x-y|的代價。ZRain真的太喜歡這些孩子了,他希望這些孩子都變成可愛的天使,但又希望付出最小的代價。   &nbs

素數,費馬! 素性測試Miller–Rabin primality test

chapter 1 Fermat's little theorem  費馬小定理 費馬小定理說的是:如果p是一個素數,那麼對於任意一個整數a,a p − a 能被p整除,也可以用模運算表示如下: (p是素數,a是整數) 這個定理又如下變式:如果p是一個素數,且整數a與p互素,那麼 a p−1 

2018 ACM-ICPC 中國大學生程序設計競賽線上賽 B. Goldbach-素數判定(大素數)

中國大學 sig anti lan icp cnblogs div con esp 若幹年之前的一道題,當時能寫出來還是超級開心的,雖然是個板子題。一直忘記寫博客,備忘一下。 米勒拉判大素數,關於米勒拉賓是個什麽東西,傳送門了解一下:biubiubiu~ B. Gold

素數測試版-哥德巴赫猜想

#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include &

-素性檢測演算法

米勒-拉賓素性檢測就是目前應用比較廣的一種隨機化素性檢測演算法。  它是基於下面兩個定理: (費馬小定理)如果 p 為素數,且 a 無法被 p 整除,則對於所有大於0小於 p 的整數 a,有

(模板)素數測試

// 18位素數:154590409516822759 // 19位素數:2305843009213693951 (梅森素數) // 19位素數:4384957924686954497 LL prime[6] = {2, 3, 5, 233, 331}; LL qmul(L

素數測試

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define maxn 0x7fffffff using name

I - How many prime numbers HDU - 2138

exc ram bool 是不是 素數 ret 測試的 AC repr Give you a lot of positive integers, just to find out how many prime numbers there are. Input There

How many prime numbers HDU - 2138 (Miller-Rabin測試)

傳送門 題意:給出一組數,測試這組數一共有多少個素數 題解:要測試N是否為素數,首先將N-1分解為(2^s)*d。在每次測試開始時,先隨機選一個介於[1,N-1]的整數a,如果對所有的r屬於[0,s-1]都滿足a^dmodN不等於1&&a^((2^r)*d)modN不等於-1

水題 第三站 How many prime numbers

判斷素數,C++程式設計課本中的程式碼,需要掌握還有值得注意的一些小細節。 bool prime(int r) { if(r==2||r==3) return true; else { for(int i=2; i<=sq

hdu 5108 Alexandra and Prime Numbers唯一分解定理

【唯一分解定理】 任意一個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,一個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。 公式:n = P1^a1 *

演算法素性測試

米勒拉賓素性測試 對於一個數n,如果想要判斷它是否為素數,常規的方法為試除法。即,讓n依次除以2到sqrt(n)以內的整數。如果有出現除盡的情況,則為合數。 該方法的時間複雜度為O(sqrt(n))在面對n為長整型的時候有可能超出時間要求。 因此普遍採用米

素性測試Miller–Rabin primality test

如何判斷一個素是素數 效率很高的篩法 打個表 (素數的倍數一定是合數) 就可以解決問題。 篩選法的效率很高,但是遇到大素數就無能為力了。 米勒羅賓素性測試是一個相當著名的判斷是否是素數的演算法 核心為

-(MillerRabbin)素性測試演算法詳解

寫在前面 網上有很多關於米勒拉賓素性測試演算法的部落格  但是大多數都是轉載,或者只有模板程式碼沒有分析講解的,甚至還有的分析的都是錯的。花了一早上,借鑑了幾十篇部落格,總算是把這個演算法理解了差不多,並且詳細整理了一下我的理解。 講解很細,篇幅較長,要是想看,準備好耐心。

Redraiment猜想----+分塊打表

Redraiment猜想 Description redraiment在家極度無聊,於是找了張紙開始統計素數的個數。 設函式f(n)返回從1->n之間素數的個數。 redraiment發現: f(1) = 0 f(10) = 4 f(100) = 25 ... 滿足g(m