PAT(Google Recruitment)


参见我去年写的素数判定

#include
#include
#include
#include
#include
#include
#include 
using namespace std;
#define N 10000000000
int prime(int num){
    int i=0;
    if(num==3||num==2){
        return num;
    }
    if(num==1||num==0){
        return 404;
    }
    for(i=2;i*i<=num;i++){
        if(num%i==0){
            return 404;
        }
    }
    return num;
}
int main(){
    int a,b,i,j,score;
    string input;
    // vectorv(N);
    cin>>a>>b;
    cin>>input;
    for(i=0;i
image.png

使用米勒-拉宾(Miller-Rabin)法:

使用自上至下的方法(网上很多用的自下至上,感觉我的这个方法理解起来更容易一些)
(据说更快,但是似乎测试数据不够大,优势不明显)

#include
#include
#include
#include
#include
#include
#include
#include 
using namespace std;
typedef long long LL;
LL aPowb(long long a,long long p,long long b){
    if(p==0){
        return 1;
    }
    if(p&1){
        // 奇数
        long long g=aPowb(a,p/2,b);
        return ((a*g%b)*g)%b;
    }
    else{
        long long g=aPowb(a,p/2,b);
        return (g*g)%b;
    }
}
int prime(int num){
    if(num&1!=1||num==1){
        return 404;
    }
    if(num==2){
        return 2;
    }
    int k=0,i=0,j=0;
    int c=num-1;
    while((c&1)==0){
        c>>=1;
        k++;
    }
    for(i=0;i<20;i++){
        c=num-1;
        // 生成20个随机数将错误率降低至(1/4)^20
        long long r=rand()%(num-2)+2;
        long long y=aPowb(r,c,num);
        if(y!=1){
            return 404;
        }
        // cout<0){
            j--;
            c/=2;
            y=aPowb(r,c,num);
            // cout<>a>>b;
    cin>>input;
    for(i=0;i
image.png

你可能感兴趣的:(PAT(Google Recruitment))