Hướng dẫn giải của [2526 KSCUM_PN] Câu 1: Tích hai số


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

Cho ba số nguyên a, b, c với |a|, |b|, |c| ≤ 10^18. Tìm tích lớn nhất trong ba tích của hai số bất kỳ, rồi in phần dư khi chia cho M = 10^9 + 7. Đề đọc từ CAU1.INP và ghi ra CAU1.OUT.

Sub 1: Tính ba tích rồi lấy max — ~O(1)~

Chỉ có ba tích ab, bc, ca. Mỗi tích có thể lên tới 10^36, vượt long long, nên dùng __int128 để tính. Lấy giá trị lớn nhất trong ba tích rồi lấy phần dư theo M. Tích lớn nhất luôn không âm (trong ba số luôn có hai số cùng dấu hoặc có số 0), nhưng vẫn cộng M nếu phần dư âm để an toàn.

Bài chỉ có một sub vì chỉ có ba tích cần tính, không có cách vét cạn nào khác đáng xét. Đạt 24/24 test.

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

int main() {
    if (fopen("CAU1.INP", "r")) { freopen("CAU1.INP", "r", stdin); freopen("CAU1.OUT", "w", stdout); }
    long long a, b, c;
    cin >> a >> b >> c;
    const long long M = 1000000007LL;
    // Tich hai so len toi 1e36, vuot long long nen dung __int128
    __int128 p1 = (__int128)a * b, p2 = (__int128)b * c, p3 = (__int128)a * c;
    __int128 best = max(p1, max(p2, p3));
    // Phan du khong am: cong M neu am
    long long r = (long long)(best % M);
    if (r < 0) r += M;
    cout << r << endl;
    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.