PAT1015甲级——欧拉筛优化(20分)
好久没写博客了 水一篇先/doge
看了一圈网上的题解都是暴力判断素数的 欧拉筛战士马上就不乐意了
因此搬出欧拉筛 直接在开局利用 O(n) 的时间复杂度拿下 2 t o 1 0 5 2\ to\ 10^5 2 to 105内的所有素数 然后进行进制转换+反转+转回十进制+判断即可 过于简单不做赘述 代码如下:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int N, D;
// 欧拉筛!!!
void Euler(vector<bool>& isnp){
int maxx = isnp.size();
vector<int> prime;
for(int i = 2; i < maxx; i++){
if(!isnp[i]){
prime.push_back(i);
}
for(auto p:prime){
if(p*i > maxx) break;
isnp[p*i] = true;
if(i%p==0) break;
}
}
}
// 转换+翻转+转换
int convert(int num, int radix){
int reverse_num = 0;
// 进行转换如下
vector<int> s;
while(num!=0){
s.push_back(num%radix);
num /= radix;
}
// 获取位数计算权重
int bits = s.size();
// 计算转换后的十进制数并返回
for(int i = 0; i < bits; i++){
reverse_num += s[i]*pow(radix, bits-i-1);
}
return reverse_num;
}
int main(){
// 开辟0-99999的非素判别组
vector<bool> isnp(100000, false);
// 摒弃0、1特殊值
isnp[0] = isnp[1] = true;
// 得到素数组
Euler(isnp);
// input
while(1){
cin>>N;
if(N<0) break;
cin>>D;
cout<<((!isnp[N]&&!isnp[convert(N, D)])?"Yes":"No");
cout<<endl;
}
}