Olympic Chuyên KHTN 2020 - Ngày 1 - Bài 1 - BABA

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài

Cho ~1~ xâu ký tự chứa toàn chữ số khác ~0~. Có ~2~ bài toán con:

  1. Có bao nhiêu xâu con liên tiếp tạo thành ~1~ số chia hết cho ~33~? Xâu con dù giống nhau nhưng ở vị trí khác nhau được coi là khác nhau.
  2. Số (được tạo từ xâu con liên tiếp) lớn nhất chia hết cho ~33~ là số nào? Nếu không có số nào in ra ~-1~.

Input

Dòng đầu chứa ~1~ xâu kí tự ~s~. Dòng tiếp theo chứa chỉ số của bài toán con.

Output

In ra đáp án trên 1 dòng duy nhất.

SUBTASKS

~30\%~ số điểm ~|s| \leq 1000~. ~70\%~ số điểm ~|s| \leq 1000000~.

Sample Input 1

1223
1

Sample Output 1

0

Sample Input 2

12311
2

Sample Output 2

231

Bình luận

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



  • 1
    PDNAM  đã bình luận lúc 21, Tháng 7, 2024, 14:19 sửa 2

    my sol:

    với bài toán con 1 , ta xây dựng một mảng sum , với sum[i] có ý nghĩa là số mà xâu con từ 1 -> i tạo thành modulo cho 33.(hiển nhiên 1 <= i <= n); nhận thấy đoạn con u -> v chia hết cho 33 khi và chỉ khi sum[v] = ( sum[u - 1] * 10 ^ (v - u + 1) ) modulo 33 nhận thấy tính chất dố nên ta cho thể sử dụng mảng d để đếm phân phối , với d[i] (0 <= i <= 32) nghĩa là số lượng (sum[j] * 10 ^ (n - j)) modulo 33 mà = i (1 <= j <= n) cuối cùng duyệt qua từng d[i] và ans += d[i] * (d[i] - 1) / 2; dpt O(n);

    với bài toán con 2 , ta xây dựng thêm một mảng kiểu pair dd , với dd[i].first là số j đầu tiên mà (sum[j] * 10 ^ (n - j)) modulo 33 mà = i , còn dd[i].second là số j cuối thoả mãn chỉ việc so sánh từng số dc tạo thành từ xâu con đánh chỉ số từ dd[i].first + 1 đến dd[i].second thôi tối đa chỉ xét tới 33 số nên dpt là O(33 * n);