Bài 1

  • Cách 1: đọc vào toàn bộ xâu trên một dòng (bao gồm dấu cách) s = input() hoặc getline(cin,s)
    • 1.1: xóa hai dấu cách thừa, dấu cách đầu câu, dấu cách cuối câu (while (tìm thấy " " trong s): xóa bớt một dấu cách tại vị trí đó)
    • 1.2: xử lý chữ hoa chữ thường (dùng tolower, toupper, lower, upper, s.title) hoặc bảng mã ASCII (hàm chr, ord)
  • Cách 2 (C++): Dùng while (cin >> s) để đọc trực tiếp từng từ!

Bài 2

Kết quả: max dãy \(a\).

Giải thích: giả sử chúng ta làm theo đề, bỏ đi hai đoạn bất kỳ, còn lại (1,2,3) đoạn rời nhau. Giả sử các phần tử còn lại là \(b_1, b_2, \dots, b_k\). Sau đó tính trung bình cộng của chúng.

Ta có \(\frac{\sum b_i}{k} \le \max{b}\)

(trung bình cộng không bao giờ lớn hơn max, vì vậy chỉ cần chọn một phần tử là max)

Bài 3

Subtask 1, Cần phải cày trâu ba vòng lặp for

Subtask 2

  1. Chỉ cần quan tâm số dư của \(a\) khi chia cho \(m\)
  2. Chỉ cần biết có 2 số dư 1, ba số dư 2, vân vân chứ không cần quan tâm cụ thể đó là số nào. \(m = 8 \Rightarrow\) đếm phân phối (mảng đếm), gọi là mảng cnt[x]
  3. \(m \le 2000\). Giả sử số \(a_i\) ta chọn là dư \(x\), số \(a_j\) là dư \(y\).
for (x chạy từ 0 tới m-1):
    for (y chạy từ 0 tới m-1):
        Có bao nhiêu cách chọn ra a[i] để a[i] chia m dư x? == cnt[x]
        Có bao nhiêu cách chọn ra a[j] để a[j] chia m dư y? == cnt[y]
        Có bao nhiêu cách chọn ra a[k] để
            (a[i] * a[j] * a[k]) % m == 0
            x * y * z (là số dư của a[k]) % m == 0
        

Làm sao để tìm ra \(z\) nhanh?
"
cho A, cho B
tìm tất cả số \(z\) sao cho \(Az\) chia hết cho \(B\)?

Ở đây \(A = x \times y\), \(B = m\)
"

\(z' = \frac{B}{\gcd{B, A}}\)

Có thể chọn \(z\) là bội của \(z'\), khi lấy \(x\times y\times z\) vẫn chia hết cho \(m\)

Tạo một mảng xử lý đếm bội trước để không phải thêm vòng lặp for

Ví dụ code 1 đoạn trong Python:
image

Select a repo