Thành phố Hà Nội có một số linh vật được đánh số thứ tự từ A đến B (A,B là hai số nguyên dương A<=B) . Lãnh đọa thành phố quyết định đấu giá những con linh vật có số thứ tự đẹp để lấy tiền ủng hộ đồng bào lũ lụt miền trung . Một số thứ tự được gọi là số đẹp nếu nó thỏa mãn các điều kiện sau : - Là một số nguyên dương T mà A<=T<=B - T là một số nguyen tố - T là một số đối xứng ( đọc T từ trái sang phải giống như đọc T từ phải qua trái ) ví dụ 12321 là một số đối xứng Yêu cầu : cho hai số nguyên dương A và B (A<=B) , hãy tìm số linh vật có số thứ tự đẹp . Input : Tệp văn bàn AUCTION.INP gồm một dòng chứa hai số nguyên dương A và B ( 0<= A<=B<=10^9) Onput. Đưa ra tệp văn bản AUCTION.OUT gồm một số nguyên là số linh vật có số thứ tự đẹp Ví dụ : AUCTION.INP 11111 22222 AUCTION.OUT 23 viết bằng c++ hoặc pascal nếu có thể

2 câu trả lời

- Vì một số đối xứng có dạng: `\overline{ab..ba} (1)` hoặc `\overline{ab..x..ba} (2)`

Trường hợp (1):

+ Ta có thể tìm T = `\overline{ab..}` sau đó đảo T lại và ghép vào sau T

Trường hợp (2):

+ Làm tương tự t.hợp (1) nhưng chèn thêm 1 số x `(0 le x le 9)`

- Sau khi thực hiện xong ta kiểm tra xem T có là số nguyên tố và `a le T le b` là xong

*Lưu ý: bạn có thể sử dụng phép kiểm tra nguyên tố thường (mình dùng miller để giảm đpt) :)

- Code (85 dòng)

#include <iostream>
#include <cmath>
using namespace std;

typedef __int128 IT;
int a, b, res;

// ---------------------------------- // Phép kiểm tra từ đây :)
IT power(IT A, IT N, IT M) {
    IT ret = 1; A = A % M;

    while (N > 0) {
        if (N & 1) ret = ret * A % M;
        N >>= 1;
        A = A * A % M;
    }

    return ret;
}

bool check(IT A, IT s, IT d, IT N) {
    if (N == A) return true;
    IT p = power(A, d, N);
    if (p == 1) return true;

    for(; s > 0; s--) {
        if (p == N - 1) return true;
        p = p * p % N;
    }

    return false;
}

bool prime(IT x) {
    if (x <= 1) return false;
    if (x % 2 == 0) return x == 2;
    if (x % 3 == 0) return x == 3;

    IT d = x - 1, s = 0;
    while ((d & 1) == 0) {
        s++;
        d >>= 1;
    }

    for(IT i: {2, 7, 61})
        if (!check(i, s, d, x)) return false;

    return true;
}
// ------------------------------//

int rev(int x) {
    int r = 0;
    while (x) r *= 10, r += x % 10, x /= 10;
    return r;
}

int count(int x) {
    return log10(x) + 1;
}

bool check(int x) {
    if (a <= x && x <= b) {
        if (prime(x)) {
        //    cout << x << "\n";
            return 1;
        }
    }
    return 0;
}

void solve(int x) {
    int tmp = rev(x), c = pow(10, count(x));
    res += check(x * c + tmp);
    for (int i = 0; i < 10; ++i) res += check(x * c * 10 + i * c + tmp);
}

void gene() {
    for (int i = pow(10, count(b) / 2); i > 0; --i) solve(i);
}

int main() {
    cin >> a >> b;
    for (int i: {2, 3, 5, 7}) res += check(i);
    gene();
    cout << res;
}

#include<bits/stdc++.h>
using namespace std;
int doixung(int n)
{
   int t=n;
   int dv,dn=0;
   while(t!=0)
   {
      dv=t%10;
      dn=dn*10+dv;
      t=t/10;
   }
   if(dn==n)
   return 1;
   return 0;
}
int nguyento(int n)
{
   if(n<2)return 0;
   for(int i=2;i<=sqrt(n);i++)
   if(n%i==0)
   return 0;
   return 1;
}
int main()
{
   int a,b,dem=0;
   cin>>a>>b;
   for(int i=a;i<=b;i++)
   {
       if(nguyento(i) && doixung(i)) dem++;
   }
   cout<<dem;
   return 0;
}

Câu hỏi trong lớp Xem thêm