题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805495863296000

思路

这题是素数和进制转换的合成题
主要注意点

  1. 进制转换的代码
  2. prime[1]不是素数,这个时候需要输出no
  1. int get_reverse(int num, int radix){
  2. vector<int> tempList;
  3. do{
  4. tempList.push_back(num % radix);
  5. num /= radix;
  6. }while(num != 0);
  7. //这个时候得到的序列已经是反过来的了
  8. int len = tempList.size(), result = 0;
  9. for(int i = 0; i < len; i++){
  10. result = result * radix + tempList[i];
  11. }
  12. return result;
  13. }

代码

  1. #include<algorithm>
  2. #include<vector>
  3. #include<cstdio>
  4. using namespace std;
  5. const int maxn = 100010;
  6. vector<bool> isPrime(maxn, true);
  7. void get_prime(){
  8. isPrime[1] = false;
  9. for(int i = 2; i < maxn; i++){
  10. if(isPrime[i]){
  11. for(int j = 2 * i; j < maxn; j += i){
  12. isPrime[j] = false;
  13. }
  14. }
  15. }
  16. }
  17. int get_reverse(int num, int radix){
  18. vector<int> tempList;
  19. do{
  20. tempList.push_back(num % radix);
  21. num /= radix;
  22. }while(num != 0);
  23. int len = tempList.size(), result = 0;
  24. for(int i = 0; i < len; i++){
  25. result = result * radix + tempList[i];
  26. }
  27. return result;
  28. }
  29. int main(){
  30. get_prime();
  31. int n, radix;
  32. while(scanf("%d", &n) != EOF){
  33. if(n < 0) break;
  34. scanf("%d", &radix);
  35. if(!isPrime[n]){
  36. printf("No\n");
  37. } else {
  38. if(isPrime[get_reverse(n, radix)]) printf("Yes\n");
  39. else printf("No\n");
  40. }
  41. }
  42. }