题目描述 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;
}