EOJ 1094 Prime Judge

来源:互联网 发布:外貌协会知乎 编辑:程序博客网 时间:2024/05/22 11:52

http://acm.cs.ecnu.edu.cn/problem.php?problemid=1094

题意:判断素数。

TLE

#include <iostream>#include <vector>using namespace std;const int maxn = 1000005;int a[maxn];vector<int> v;void init(){a[0] = 1;a[1] = 1;for(int i=2; i<maxn; i++){if(a[i] == 1)continue;v.push_back(i);for(int j=2; j*i < maxn; j++)a[i*j] = 1;}} void print(){int s = v.size();for(int i=0; i<s; i++){cout << v[i] << endl;}} int main(){init();long long n;while(cin >> n){if(n < maxn){if(a[n] == 0){cout << "YES" << endl;}else {cout << "NO" << endl;}}else {for(int i=0; i<v.size() && n != 1; i++){if(n % v[i] == 0){while(n % v[i] == 0){n /= v[i];}}}if(n == 1){cout << "NO" << endl;}else {cout << "YES" << endl;}}}//print();return 0;}

miller rabbin

TLE:做50次太多了,安神说四次都超,三次就过了AC

#include<stdio.h>#include<stdlib.h>#include<cmath>//typedef long long  __int64;bool witness(__int64 a, __int64 n){    __int64 t,d,x;    d=1;    int i=ceil(log(n-1.0)/log(2.0)) - 1;    for(;i>=0;i--)    {        x=d;  d=(d*d)%n;        if(d==1 && x!=1 && x!=n-1) return true;        if( ((n-1) & (1<<i)) > 0)d=(d*a)%n;    }    return d==1?false: true;} bool miller_rabin(__int64 n){    if(n==2)    return true;    if(n==1 || ((n&1)==0))    return false;    for(int i=0;i<3;i++){         __int64 a=rand()*(n-2)/RAND_MAX +1;        if(witness(a, n))    return false;    }    return true;} int main(){    __int64 a;    while(scanf("%I64d",&a)!=EOF)    {        if(miller_rabin(a))printf("YES\n");        else printf("NO\n");    }    return 0;}



原创粉丝点击