题目描述
现在给出一个素数,这个素数满足两点:
1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。
2、 位数从高到低为递减或递增,如2459,87631。
请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的回文数是12721)。
输入描述:
输入只有1行。
第1行输入一个整数t,保证t为素数。
数据保证:9<t<109
输出描述:
输出一行字符串,如果t的回文数仍是素数,则输出“prime”,否则输出"noprime"。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mul(ll a,ll b,ll mod)
{
ll ans(0);
while(b)
{
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
ll bow(ll a,ll p)
{
ll ans =1,k=p-1;
while(k)
{
if(k&1)
ans=(mul(ans,a,p))%p;
a=(mul(a,a,p))%p;
k>>=1;
}
return ans;
}
bool miller_rabin(ll x)
{
if(x==2) return true;
if(!(x&1)||x==1) return false;
bool judge=true;
for(int i=0;i<10;i++)
judge&=bow(rand()%(x-2)+2,x)==1;
return judge;
}
int main()
{
string s; cin>>s;
ll a(0),p=1,len=s.size();
for(int i=0;i<len;i++) a+=p*(s[i]-'0'),p*=10;
for(int i=len-2;i>=0;i--) a+=p*(s[i]-'0'),p*=10;
puts(miller_rabin(a)?"prime":"noprime");
return 0;
}
这段代码主要是判断给定的素数是否为回文素数。
首先,代码定义了一个辅助函数`mul`,用于执行快速乘法运算。该函数接受三个参数a、b和mod,分别表示被乘数、乘数和取模数。通过循环将a和b进行相乘,取结果对mod的模,并返回最终的结果。
接下来,代码定义了一个辅助函数`bow`,用于执行快速幂运算。该函数接受两个参数a和p,分别表示底数和指数。通过循环将a进行平方运算,取结果对p的模,并不断更新结果ans。最终返回计算完成后的ans。
然后,代码定义了一个辅助函数`miller_rabin`,用于判断一个数是否为素数。该函数接受一个参数x,表示待判断的数。首先对特殊情况进行处理,当x等于2时,直接返回true;当x为偶数或x等于1时,直接返回false。然后利用Miller-Rabin素性测试进行判断。通过循环10次,随机选择一个大于等于2且小于x-2的底数,判断该底数的p-1次幂对x取模的结果是否等于1。如果所有的判断都通过,说明x可能是一个素数,返回true;否则返回false。
在main函数中,代码首先读取输入的字符串s,表示待判断的素数。
接下来,代码通过循环将字符串转换为数值a。从字符串的首尾分别遍历,将每一位数字乘以相应的权重p,并累加到a中。其中,权重p初始值为1,每次循环乘以10。
然后,代码利用循环将字符串的一半(除去个位数)反序累加到a中。从字符串的倒数第二位开始向前遍历,将每一位数字乘以相应的权重p,并累加到a中。然后,权重p乘以10。
最后,代码调用`miller_rabin`函数判断a是否为素数,并根据判断结果输出相应的结果。