codevs 1702 素数判定2 玄学?? 解题报告?

题目描述 Description

一个数,他是素数么?

设他为P满足(P<=263-1)

输入描述 Input Description

P

输出描述 Output Description

Yes|No

样例输入 Sample Input

2

样例输出 Sample Output

Yes

数据范围及提示 Data Size & Hint

算法导论——数论那一节
注意Carmichael Number

思路

我怎么知道思路啊我就是不知道啊!!!
想用米勒拉宾来判断,复杂度o(p*logn),p是个数,取决于你想要的精度。然后我写的丑常数比较大,于是就只有40分!!
根本不会啊求助大佬啊

代码

抽风扯淡代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<ctime>
using namespace std;  
long long qpow(int a,int b,int r)
{  
    long long ans=1,base=a;  
    while(b)  
    {  
        if (b&1) ans=(ans*base)%r;  
        base=(base*base)%r;  
        b>>=1;  
    }  
    return ans;  
}  
int Miller_Rabbin(int n,int a)//米勒拉宾素数测试  
{  
    int r=0,s=n-1,j;  
    if (!(n%a)) return 0;  
    while(!(s&1)) {s>>=1;r++;}  
    long long k=qpow(a,s,n);  
    if (k==1) return 1;  
    for (j=0;j<r;j++,k=k*k%n)  
    if (k==n-1) return 1;  
    return 0;  
}  
bool IsPrime(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()  
{  
    long long n;  
    scanf("%I64d",&n);
    if (IsPrime(n)==1) printf("Yes\n");
    else printf("No\n"); 
    return 0;  
}  

这哥们儿过了??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值