Hướng dẫn giải của [2026-2027] Đề minh họa THPT Phú Thọ - Câu 2


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Với mỗi cặp (a, b), xóa chữ số 0 của a, b và c = a + b rồi kiểm tra đẳng thức a' + b' = c'.

Sub 1: Bảng tra cứu — dùng khi ~a, b \le 10^4~

Khi a, b \le 10^4 thì c \le 2\cdot 10^4. Tính trước giá trị xóa số 0 của mọi số từ 0 đến 20000 rồi tra bảng để so sánh.

Nếu chỉ nộp sub này: đúng 10/20 test (phần còn lại vượt miền).

Sub 2: Tính trực tiếp — ~a, b \le 10^{12}~

Xóa số 0 bằng cách duyệt từ chữ số hàng đơn vị: chữ số khác 0 được ghép vào kết quả với trọng số lũy thừa 10 tăng dần. Tính cho a, b và c rồi so sánh.

Nếu chỉ nộp sub này: đúng 20/20 test.

Chương trình hoàn chỉnh

Chương trình đọc toàn bộ truy vấn. Nếu mọi a, b \le 10^4 thì gọi sub1, ngược lại gọi sub2.

#include <bits/stdc++.h>
using namespace std;

int t;
vector<long long> A, B;

// Xoa tat ca chu so 0 cua x: duyet tu hang don vi len, chu so khac 0 ghep vao dau ket qua
long long rz(long long x) {
    long long res = 0, mul = 1;
    while (x > 0) {
        int d = x % 10;
        x /= 10;
        if (d != 0) {
            res += d * mul;
            mul *= 10;
        }
    }
    return res;
}

// Sub 1: a, b <= 10^4 nen c <= 2*10^4. Lap bang tra cuu truoc roi tra ngay
void sub1() {
    vector<long long> table(20005);
    for (int x = 0; x < 20005; x++) table[x] = rz(x);
    for (int i = 0; i < t; i++) {
        long long c = A[i] + B[i];
        cout << (table[A[i]] + table[B[i]] == table[c] ? "YES" : "NO") << "\n";
    }
}

// Sub 2: tinh truc tiep moi truong hop, a, b <= 10^12
void sub2() {
    for (int i = 0; i < t; i++) {
        long long c = A[i] + B[i];
        cout << (rz(A[i]) + rz(B[i]) == rz(c) ? "YES" : "NO") << "\n";
    }
}

int main() {
    freopen("CAU2.INP", "r", stdin);
    freopen("CAU2.OUT", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> t;
    A.resize(t);
    B.resize(t);
    long long mx = 0;
    for (int i = 0; i < t; i++) {
        cin >> A[i] >> B[i];
        mx = max(mx, max(A[i], B[i]));
    }
    if (mx <= 10000) sub1();
    else sub2();
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.