快速判断是否为素数
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef unsigned long long ll;
using namespace std;
ll add_mod(ll a,ll b,ll mod){
ll ans=0;
while(b){
if(b&1)
ans=(ans+a)%mod;
a=a*2%mod;
b>>=1;
}
return ans;
}
ll pow_mod(ll a,ll n,ll mod){
if(n>1){
ll tmp=pow_mod(a,n>>1,mod)%mod;
tmp=add_mod(tmp,tmp,mod);
if(n&1) tmp=add_mod(tmp,a,mod);
return tmp;
}
return a;
}
bool Miller_Rabbin(ll n,ll a){
ll d=n-1,s=0,i;
while(!(d&1)){
d>>=1;
s++;
}
ll t=pow_mod(a,d,n);
if(t==1 || t==-1)
return 1;
for(i=0;i<s;i++){
if(t==n-1)
return 1;
t=add_mod(t,t,n);
}
return 0;
}
bool is_prime(ll n){
ll i,tab[4]={3,4,7,11};
for(i=0;i<4;i++){
if(n==tab[i])
return 1;
if(!n%tab[i])
return 0;
if(n>tab[i] && !Miller_Rabbin(n,tab[i]))
return 0;
}
return 1;
}
int main(){///快速判断是否为素数
ll n;
scanf("%lld",&n);
if(is_prime(n))
printf("yes\n");
else printf("no\n");
return 0;
}
颠倒的素数,正序和逆序都是素数
ac:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef unsigned long long ll;
using namespace std;
ll add_mod(ll a,ll b,ll mod){
ll ans=0;
while(b){
if(b&1)
ans=(ans+a)%mod;
a=a*2%mod;
b>>=1;
}
return ans;
}
ll pow_mod(ll a,ll n,ll mod){
if(n>1){
ll tmp=pow_mod(a,n>>1,mod)%mod;
tmp=add_mod(tmp,tmp,mod);
if(n&1) tmp=add_mod(tmp,a,mod);
return tmp;
}
return a;
}
bool Miller_Rabbin(ll n,ll a){
ll d=n-1,s=0,i;
while(!(d&1)){
d>>=1;
s++;
}
ll t=pow_mod(a,d,n);
if(t==1 || t==-1)
return 1;
for(i=0;i<s;i++){
if(t==n-1)
return 1;
t=add_mod(t,t,n);
}
return 0;
}
bool is_prime(ll n){
ll i,tab[4]={3,4,7,11};
for(i=0;i<4;i++){
if(n==tab[i])
return 1;
if(!n%tab[i])
return 0;
if(n>tab[i] && !Miller_Rabbin(n,tab[i]))
return 0;
}
return 1;
}
int main(){
ll n;
while(cin>>n)
{
ll kk=n;
ll temp=0;
int flag=1;
while(n)
{
ll t=n%10;
if(t==3||t==4||t==7)
{
flag=0;
break;
}
if(t==6)
t=9;
else if(t==9)
t=6;
temp=temp*10+t;
n/=10;
}
if(!flag)
{
cout<<"no"<<endl;
continue;
}
if(is_prime(temp)&&temp!=1&&is_prime(kk))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}