Bỏ qua để đến nội dung

HSG lớp 9 Thái Nguyên 2025-2026

UBND TỈNH THÁI NGUYÊN SỞ GIÁO DỤC VÀ ĐÀO TẠO ĐỀ THI CHÍNH THỨC
(Đề thi gồm 04 trang)

THI CHỌN HỌC SINH GIỎI CẤP TỈNH LỚP 9 Năm học 2025 - 2026
Môn: Tin học
Thời gian làm bài: 150 phút (không kể thời gian phát đề)


Thí sinh trả lời từ câu 1 đến câu 12. Mỗi câu hỏi thí sinh chỉ chọn một phương án trả lời.

Câu 1. Nút lệnh nào dưới đây dùng để định dạng văn bản kiểu danh sách liệt kê dạng có thứ tự?

Bốn phương án A, B, C, D là bốn biểu tượng nút lệnh trên thanh công cụ soạn thảo văn bản

Câu 2. Cho thuật toán sau:

  • Bước 1: P ← 1, i ← 1;
  • Bước 2: Nếu i > 4 thì chuyển đến Bước 4;
  • Bước 3: P ← P * i; i ← i + 1 rồi quay lại Bước 2;
  • Bước 4: In giá trị P rồi kết thúc.

Phương án nào dưới đây là giá trị của P sau khi kết thúc thuật toán trên?

A. 10   B. 24   C. 120   D. 4

Câu 3. Phương án nào dưới đây xác định đúng Input và Output của bài toán: “Tìm ước chung lớn nhất (UCLN) của hai số nguyên dương a và b”?

  • A. Input: UCLN; Output: a, b.
  • B. Input: a, b; Output: UCLN của a và b.
  • C. Input: a; Output: b.
  • D. Input: Các ước của a; Output: Các ước của b.

Câu 4. Khi thực hiện công thức: =MIN(34; 23+15; 120/4; SUM(1; 2; 3; 4; 5)) sẽ cho kết quả nào trong các phương án dưới đây?

A. 34   B. 1   C. 15   D. 30

Câu 5. Hàm nào sau đây cho phép tính tổng giá trị các ô thỏa mãn điều kiện cho trước?

A. IF   B. SUM-IF   C. COUNTIF   D. SUMIF

Câu 6. Cho khối lệnh sau:

set [a v] to (20)
set [b v] to (15)
repeat (5)
change [b v] by (2)
set [a v] to ([floor v] of ((a) / (2)))
end

Sau khi thực hiện khối lệnh trên, phương án nào dưới đây nêu đúng về giá trị lần lượt của a và b?

A. 0; 25   B. 20; 15   C. 0.625; 25   D. 1; 25

Câu 7. Một USB có dung lượng trống 2 GB có thể chứa tối đa bao nhiêu tệp tin có kích thước 500KB? Chọn đáp án đúng trong các phương án sau:

A. 4195   B. 4149   C. 4194   D. 4193

Câu 8. Cho dãy thao tác sau:

  • Bước 1: Nhập hai số nguyên a, b;
  • Bước 2: r ← a chia lấy dư b;
  • Bước 3: Nếu r = 0 thì chuyển đến Bước 5;
  • Bước 4: a ← b, b ← r và quay lại Bước 2;
  • Bước 5: Xuất b rồi kết thúc.

Với a = 26, b = 18 thì phương án nào sau đây thể hiện đúng số lần thực hiện tại Bước 4?

A. 1   B. 2   C. 3   D. 4

Câu 9. Trong Excel, tại ô E2 có công thức =C2+$D$1. Khi thực hiện sao chép công thức từ ô E2 xuống ô E3 thì ô E3 có công thức nào sau đây?

  • A. =C3+$D$1
  • B. =C3+$D$2
  • C. =C2+$D$1
  • D. =D3+$E$1

Câu 10. Cho dãy thao tác sau:

  • Bước 1: Nhập n (n > 0) và dãy gồm n số nguyên a1, a2, a3, …, an;
  • Bước 2: i ← 1; T ← 0;
  • Bước 3: Nếu i > n thì chuyển đến Bước 5;
  • Bước 4:
    • 4.1. Nếu ai chia hết cho 3 hoặc ai chia hết cho 5 thì T ← T + ai;
    • 4.2. i ← i + 1 rồi quay lại Bước 3;
  • Bước 5: Xuất T và kết thúc.

Với n = 5; dãy A gồm các số 12, 8, 3, 11, 30 thì thuật toán xuất ra giá trị nào sau đây?

A. 30   B. 15   C. 35   D. 45

Câu 11. Phương án nào sau đây là chức năng của tổ hợp phím Ctrl + Z trong hầu hết các phần mềm soạn thảo?

  • A. Lưu tài liệu (Save).
  • B. Sao chép (Copy).
  • C. Hoàn tác (Undo).
  • D. Dán dữ liệu (Paste).

Câu 12. Trong bảng tính Excel có các cột điểm: Toán từ ô C5 đến ô C100, Ngữ văn từ ô D5 đến ô D100; Tin học từ ô E5 đến E100. Để tính điểm trung bình ba môn này (Toán và Ngữ văn có hệ số 2, Tin học hệ số 1) thì tại ô F5 cần nhập công thức nào dưới đây?

  • A. =AVERAGE(C5:E5)
  • B. =SUM((C5+D5)*2+E5)/5
  • C. =C5*2+D5*2+E5/5
  • D. =SUM((C5+D5)*2+E5)/3

Phần 2. Lập trình trên máy tính (14,0 điểm)

Phần tiêu đề “Phần 2. Lập trình trên máy tính (14,0 điểm)”
STTTên bàiTệp chương trìnhInputOutputĐiểm
1QUÀ TẶNG HỘI XUÂNQUA_TANG.*Thiết bị chuẩnThiết bị chuẩn5 điểm
2MẬT MÃ HỘI XUÂNMAT_MA.*Thiết bị chuẩnThiết bị chuẩn5 điểm
3QUẢN LÍ LỊCH HỌC THÔNG MINHQUAN_LI.*Thiết bị chuẩnThiết bị chuẩn4 điểm

Dấu * được thay thế bởi PAS, CPP hoặc PY của ngôn ngữ lập trình sử dụng tương ứng là Pascal, C++ hoặc Python.

Trong lễ khai mạc Hội xuân tại quảng trường Võ Nguyên Giáp (tỉnh Thái Nguyên), Ban tổ chức có một phần quà đặc biệt dành cho các bạn học sinh yêu thích toán học và lập trình.

Thử thách đưa ra như sau:

Cho một số nguyên dương n. Bạn cần tính tổng lập phương của tất cả các số tự nhiên từ 1 đến n. Ký hiệu tổng này là S(n):

S(n) = 13 + 23 + 33 + ⋯ + n3

Vì kết quả S(n) có thể rất lớn, Ban tổ chức chỉ yêu cầu bạn in ra phần dư của S(n) khi chia cho 20262.

Yêu cầu: Hãy lập trình giúp các bạn học sinh giải quyết thử thách trên để nhận phần quà từ Ban tổ chức.

Dữ liệu vào: Đọc từ bàn phím (thiết bị vào chuẩn):

  • Một số nguyên dương n (1 ≤ n ≤ 1012).

Kết quả: Ghi ra màn hình (thiết bị ra chuẩn):

  • Số nguyên duy nhất là giá trị S(n) mod 20262 (mod là phép chia lấy phần dư).

Ví dụ:

InputOutputGiải thích
33613 + 23 + 33 = 36; 36 mod 20262 = 36
10302513 + 23 + 33 + … + 93 + 103 = 3025; 3025 mod 20262 = 3025

Ràng buộc:

  • Có 50% số điểm tương ứng với 1 < N ≤ 10.
  • Có 30% số điểm tương ứng với 10 < N ≤ 102.
  • Có 20% số điểm còn lại tương ứng với 102 < N ≤ 1012.

Trong trò chơi “Đi tìm kho báu” tại Hội xuân, Tí tìm thấy một mẩu giấy ghi một dãy các ký tự bao gồm cả chữ cái và chữ số. Để mở được hòm kho báu, Tí cần trích xuất tất cả các số tự nhiên xuất hiện trong dãy đó và tìm số lớn nhất. Biết rằng các số trong dãy được phân cách nhau bởi các ký tự chữ cái.

Yêu cầu: Hãy giúp Tí tìm số tự nhiên lớn nhất có trong xâu ký tự cho trước.

Dữ liệu vào: Đọc từ bàn phím (thiết bị vào chuẩn):

  • Một xâu ký tự S có độ dài không quá 105 chỉ chứa các chữ cái tiếng Anh (hoa, thường) và các chữ số từ 0 đến 9.

Kết quả: Ghi ra màn hình (thiết bị ra chuẩn):

  • Số tự nhiên lớn nhất tìm được. Nếu trong xâu không có số nào, ghi -1.

Ví dụ:

InputOutputGiải thích
ThaiNguyenNo11Chỉ có một số tự nhiên duy nhất là 1.
Hoi28Xuan12ThaiNguyen20262026Có ba số tự nhiên là 28, 12, 2026. Số lớn nhất là 2026.
XuanBinhNgo-1Không có số tự nhiên nào xuất hiện trong xâu.

Ràng buộc:

  • Có 20% số điểm tương ứng với xâu S chỉ xuất hiện một số tự nhiên.
  • Có 30% số điểm tương ứng với xâu S có độ dài < 100, các số xuất hiện đều nhỏ hơn 106.
  • Có 30% số điểm tương ứng với xâu S có độ dài ≤ 104, các số xuất hiện đều nhỏ hơn 109.
  • Có 20% số điểm còn lại tương ứng với xâu S có độ dài ≤ 105, các số xuất hiện có tối đa 4000 chữ số.

Một Trung tâm Ngoại ngữ có tổ chức lớp học trực tuyến (online), trong đó có n tiết học (từ 1 đến n), tiết học thứ i có thời lượng ai (tính bằng giây). Học viên có thể đăng ký học liên tiếp nhiều tiết học. Hãy tìm số lượng tiết học liên tiếp tối đa mà một học viên có thể tham gia trong một khoảng thời gian không vượt quá thời gian rảnh của họ.

Yêu cầu: Có q truy vấn, mỗi truy vấn cho biết thời gian rảnh của học viên là t giây. Với mỗi truy vấn, bạn cần tìm số lượng tiết học liên tiếp nhiều nhất mà học viên có thể tham gia trong thời gian không quá t giây.

Dữ liệu: Đọc từ bàn phím (thiết bị vào chuẩn):

  • Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 104) là số lượng tiết học.
  • Dòng thứ hai chứa n số nguyên (cách nhau 1 dấu cách) a1, a2, …, an (1 ≤ ai ≤ 104) là thời lượng của từng tiết.
  • Dòng thứ ba chứa số nguyên q (1 ≤ q ≤ 104) là số lượng truy vấn.
  • q dòng tiếp theo, mỗi dòng chứa một số nguyên t (1 ≤ t ≤ 108) là thời gian rảnh của học viên.

Kết quả: Ghi ra màn hình (thiết bị ra chuẩn):

Với mỗi truy vấn, in ra số lượng tiết học liên tiếp nhiều nhất mà học viên có thể tham gia trong thời gian t giây. Lưu ý học viên không bắt buộc phải tham gia từ tiết 1.

Ví dụ:

InputOutputGiải thích
5
4 2 3 1 5
3
7
10
15
3
4
5
- Truy vấn 1: t = 7. Có thể tham gia 3 tiết học liên tiếp 2, 3, 4 có tổng thời gian học là: 2 + 3 + 1 = 6 ≤ 7.
- Truy vấn 2: t = 10. Có thể tham gia 4 tiết học liên tiếp 1, 2, 3, 4 có tổng thời gian học là: 4 + 2 + 3 + 1 = 10 ≤ 10.
- Truy vấn 3: t = 15. Có thể tham gia tất cả 5 tiết học có tổng thời gian học là 4 + 2 + 3 + 1 + 5 = 15 ≤ 15.

Ràng buộc:

  • Có 40% số điểm tương ứng với 10 < n, q ≤ 5.102.
  • Có 30% số điểm tương ứng với 5.102 < n, q ≤ 103.
  • Có 30% số điểm tương ứng với 103 < n, q ≤ 104.

Thí sinh không được sử dụng tài liệu. Giám thị không giải thích gì thêm.

Phần 2. Lập trình trên máy tính (14,0 điểm)

Phần tiêu đề “Phần 2. Lập trình trên máy tính (14,0 điểm)”
Xem hướng dẫn & lời giải

Dùng hằng đẳng thức 13 + 23 + … + n3 = [n(n + 1)/2]2. Chia một trong hai số n, n + 1 (số chẵn) cho 2 trước, lấy modulo 20262 sau mỗi phép nhân và dùng __int128.

Độ phức tạp: O(1).

#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
int main() {
int64 n;
cin >> n;
const int64 MOD = 2026LL * 2026;
__int128 a = n, b = n + 1;
if (a % 2 == 0)
a /= 2;
else
b /= 2;
int64 t = (long long)((a % MOD) * (b % MOD) % MOD);
cout << (long long)((__int128)t * t % MOD);
}
Xem hướng dẫn & lời giải

Tách các đoạn chữ số liên tiếp, bỏ các chữ số 0 vô nghĩa ở đầu rồi so sánh theo độ dài, sau đó theo thứ tự từ điển. Cách này xử lý được số dài tới 4000 chữ số mà không cần kiểu số lớn. Không có đoạn chữ số nào thì in −1.

Độ phức tạp: O(|S|).

#include <bits/stdc++.h>
using namespace std;
string norm(string x) {
size_t p = x.find_first_not_of('0');
return p == string::npos ? "0" : x.substr(p);
}
bool bigger(const string &a, const string &b) {
return a.size() != b.size() ? a.size() > b.size() : a > b;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s, best;
cin >> s;
for (size_t i = 0; i < s.size();) {
if (!isdigit((unsigned char)s[i])) {
++i;
continue;
}
size_t j = i;
while (j < s.size() && isdigit((unsigned char)s[j]))
++j;
string x = norm(s.substr(i, j - i));
if (best.empty() || bigger(x, best))
best = x;
i = j;
}
cout << (best.empty() ? "-1" : best);
}
Xem hướng dẫn & lời giải

Với mỗi độ dài L, trượt cửa sổ để tính tổng nhỏ nhất của một đoạn L tiết liên tiếp, gọi là mn[L]. Vì mọi a[i] dương nên mn[L] tăng ngặt theo L. Mỗi truy vấn dùng upper_bound tìm L lớn nhất có mn[L] ≤ t.

Tiền xử lý O(N2): với N = 104 là khoảng 5·107 lần cập nhật cửa sổ, vẫn chạy nhanh.

Độ phức tạp: O(N2 + Q log N).

#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int64> a(n), mn(n + 1, LLONG_MAX);
for (auto &x : a)
cin >> x;
mn[0] = 0;
for (int len = 1; len <= n; len++) {
int64 s = 0;
for (int i = 0; i < len; i++)
s += a[i];
mn[len] = s;
for (int r = len; r < n; r++) {
s += a[r] - a[r - len];
mn[len] = min(mn[len], s);
}
}
int q;
cin >> q;
while (q--) {
int64 t;
cin >> t;
cout << (upper_bound(mn.begin(), mn.end(), t) - mn.begin() - 1) << '\n';
}
}