You are on page 1of 8

SỞ GIÁO DỤC VÀ ĐÀO TẠO KỲ THI CHỌN HỌC SINH GIỎI THPT CẤP TỈNH

HƯNG YÊN NĂM HỌC 2020-2021


Môn thi: Tin học
ĐỀ CHÍNH THỨC Thời gian làm bài: 180 phút, không kể thời gian giao phát đề
(Đề gồm 03 trang)

ĐÁP ÁN, BIỂU ĐIỂM HƯỚNG DẪN CHẤM


Môn thi: TIN HỌC
I. PHẦN ĐỀ THI
Tên file Tên file Tên file
Tên bài Điểm
chương trình dữ liệu kết quả
Câu 1 Chính phương SQROOT.* SQROOT.INP SQROOT.OUT 5
Câu 2 Trung bình lớn nhất AVERAGE.* AVERAGE.INP AVERAGE.OUT 6
Câu 3 Phần thưởng BONUS.* BONUS.INP BONUS.OUT 6
Câu 4 Ghép chữ số DIGITS.* DIGITS.INP DIGITS.OUT 3
Phần mở rộng .* là: .pas đối với Pascal; .cpp đối với C++
Hãy lập trình giải các bài toán sau:
Câu 1: Chính phương (5 điểm)
An là một người yêu toán học nên thường xuyên tính toán với các con số. An vừa học về
số chính phương và dễ dàng viết ra dãy A gồm các số nguyên dương là chính phương theo thứ
tự từ bé đến lớn như sau: 1 , 4 , 9 , 16 , 25 ,36 , … Để xác định một số chính phương là vô cùng dễ
dàng. An thắc mắc tổng của n số đầu tiên của dãy là bao nhiêu.
Yêu cầu: Cho số tự nhiên n , hãy lập trình tính toán giúp An giá trị T là tổng của n số đầu tiên
trong dãy A .
Dữ liệu: Vào từ file văn bản SQROOT.INP một dòng duy nhất là số nguyên dương n( n ≤1010 ).
Kết quả: Ghi ra file văn bản SQROOT.OUT một số nguyên duy nhất là số dư của T trong phép
chia cho 2021.
Ví dụ 1 Ví dụ 2
SQROOT.INP SQROOT.OUT SQROOT.INP SQROOT.OUT
4 30 20 849

Giải thích:
 Trong ví dụ 1: T =1+4 +9+16=30. Số bạn cần đưa ra là 30 mod 2021=30 .
 Trong ví dụ 2: T =1+4 +9+ …+400=2870. Số bạn cần đưa ra là 2870 mod 2021=849 .
Ràng buộc:
 Có 60 % số test tương ứng với 60% số điểm có n ≤ 17.
 Có 30% số test khác tương ứng với 30% số điểm có n ≤ 2.103.
 Có 10 % số test còn lại tương ứng 10% số điểm có n ≤ 1010.
Câu 2: Trung bình lớn nhất (6 điểm)
Cho số nguyên dương n và dãy số nguyên a 1 , a2 , a3 , … , an. Gọi đoạn con [u,v]của dãy là
các phần tử liên tiếp a u , au +1 , au+2 , … , av (u ≤ v ). Dễ thấy đoạn [u , v ] có độ dài là v−u+1 và giá
au +a u+1 +au +2+ …+a v
trung bình là .
v−u+ 1
Yêu cầu: Cho số nguyên k , hãy xác định đoạn con có độ dài không nhỏ hơn k có giá trị trung bình
lớn nhất.

1
Dữ liệu: Vào từ file AVERAGE.INP
 Dòng đầu chứa 2 số nguyên dương n , k ;
9
 Dòng thứ 2 chứa n số nguyên a 1 , a2 , … , an (¿ a i∨≤10 ∀ i∈[ 1 , n]). Các số được phân tách
nhau bởi dấu cách.
Kết quả: Đưa ra file AVERAGE.OUT một số thực duy nhất là giá trị trung bình tìm được. Kết
quả in ra lấy ba chữ số phần thập phân sau dấu phẩy.
Ví dụ 1 Ví dụ 2
AVERAGE.INP AVERAGE.OUT AVERAGE.INP AVERAGE.OUT
4 2 10.333 5 1 8.000
17 0 14 1 2 8 -1 4 5
Giải thích:
 Trong ví dụ 1, đoạn con có giá trị trung bình lớn nhất thỏa mãn là đoạn [1, 3] với các giá
trị 17, 0, 14.
 Trong ví dụ 2, đoạn con có giá trị trung bình lớn nhất thỏa mãn là đoạn [2, 2] với giá trị 8 .
Ràng buộc:
 Có 20 % số test tương ứng với 20% số điểm có n ≤ 400 ; k =1.
 Có 30 % số test tương ứng với 30% số điểm có 1<k ≤ n ≤ 400.
 Có 30% số test khác tương ứng với 30% số điểm có 1<k ≤ n ≤5.10 3.
 20 % số test còn lại tương ứng 20% số điểm có 1<k ≤ n ≤2.10 5.
Câu 3: Phần thưởng (6 điểm)
Thanh hiện tại đang là quản lý của rạp xiếc tại thành phố XYZ. Sau khi rạp xiếc khai
trương được một tuần đã nhận được rất nhiều lời nhận xét tích cực từ khán giả. Mọi người đều
rất muốn được thưởng thức các tiết mục xiếc của rạp khiến cho lượng khách đến rạp những
ngày gần đây tăng lên khá nhiều. Nhưng số lượng khách hàng tăng cũng tỉ lệ thuận với độ nặng
nhọc trong công việc của các nhân viên. Để khuyến khích tinh thần cho các nhân viên của mình,
hôm nay Thanh quyết định mỗi khi số lượng vé bán ra là một số không chia hết cho bất kỳ số
nào từ 2 đến k thì mỗi nhân viên sẽ được thưởng 1 đồng. Cuối ngày, Thanh được báo cáo đã bán
ra tổng cộng n vé.
Yêu cầu: Hãy giúp Thanh xác định số tiền thưởng của mỗi nhân viên nhận được trong ngày là
bao nhiêu đồng.
Dữ liệu: Vào từ file văn bản BONUS.INP gồm hai số nguyên dương n , k ( 2≤ k ≤ 20) ghi cách
nhau bởi dấu cách.
Kết quả: Đưa ra file văn bản BONUS.OUT gồm một dòng ghi một số nguyên là kết quả tìm
được.
Ví dụ 1 Ví dụ 2
BONUS.INP BONUS.OUT BONUS.INP BONUS.OUT
10 3 3 20 7 5
Giải thích:
 Trong ví dụ 1, mỗi nhân viên sẽ được thêm 1 đồng ở các thời điểm số lượng vé bán ra là
1 ,5 , 7 .
 Trong ví dụ 2, mỗi nhân viên sẽ được thêm 1 đồng ở các thời điểm số lượng vé bán ra là
1 ,11 , 13 ,17 ,19 .
Ràng buộc:
 Có 10 % số test tương ứng với 10% số điểm có n ≤ 1000; k=2 .
 Có 30% số test khác tương ứng với 30% số điểm có n ≤ 106 ; k ≤20 .
 Có 30% số test khác tương ứng với 30% số điểm có n ≤ 1012 ; k =5.
2
 30 % số test còn lại tương ứng 30% số điểm có n ≤ 1012 ; k ≤ 20.
Câu 4: Ghép chữ số (3 điểm)
Hôm nay, trong giờ toán, cô giáo tổ chức cho các bạn nhỏ thực hiện trò chơi ghép số. Các
bạn sẽ sử dụng các miếng dán, trên mỗi miếng ghi 1 chữ số. Cô phát cho các bạn tổng cộng x i
miếng dán chứa chữ số i(0 ≤ i≤ 9). Các bạn thực hiện trò chơi ghép số như sau: cô giáo chọn
ngẫu nhiên một số tự nhiên n . Cô yêu cầu các bạn ghép tạo thành dãy các số tự nhiên liên tiếp
bắt đầu từ n trở đi tới khi không còn đủ miếng dán để tạo thêm số tiếp theo thì dừng lại.
Yêu cầu: Cho số tự nhiên n và các số x 0 , x 1 , x 2 , … , x 9. Hãy xác định số lượng số của dãy mà các
bạn nhỏ ghép được theo yêu cầu. Chú ý, mỗi miếng dán chỉ được sử dụng một lần duy nhất.
Dữ liệu: Vào từ file văn bản DIGITS.INP
 Dòng đầu chứa số nguyên dương n ;
 Dòng thứ hai chứa 10 số nguyên không âm theo thứ tự x 0 , x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 , x 9. Các
số được ghi cách nhau bởi 1 dấu cách.
Kết quả: Ghi ra file văn bản DIGITS.OUT một số nguyên duy nhất là số lượng số của dãy mà
các bạn nhỏ ghép được.
Ví dụ 1 Ví dụ 2
DIGITS.INP DIGITS.OUT DIGITS.INP DIGITS.OUT
12 4 103 0
0 4 2 1 1 1 3 0 0 0 9 4 2 0 1 1 3 0 0
0
Giải thích:
 Trong ví dụ 1, dãy các số ghép được là 12, 13, 14, 15. Số 16 không ghép được do không
còn đủ chữ số 1.
 Trong ví dụ 2, không thể tạo được số 103 do không có chữ số 3. Do đó, không ghép được
số nào.
Ràng buộc:
9
 Có 40 % số test tương ứng với 40% số điểm có n ≤ 10 ; x i ≤1000 ∀ i=0 , 1 ,2 … , 9.
9 11
 60 % số test còn lại tương ứng với 60% số điểm có n ≤ 10 ;x i ≤10 ∀ i=0 ,1 , 2 … , 9.

-----------------HẾT-----------------

Thí sinh không sử dụng tài liệu, cán bộ coi thi không giải thích gì thêm.
Họ và tên thí sinh:………………………………… SBD:………………………...............
Chữ kí giám thị: ……………………………………………………………………………..

3
II. PHẦN HƯỚNG DẪN CHẤM
1. Giải thuật của các bài toán
Câu 1: Chính phương (5 điểm)
#include <bits/stdc++.h>
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define reset(x) memset(x, 0,sizeof(x))
#define Rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define For(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define MIN(x,y) if (x > (y)) x = (y)
#define MAX(x,y) if (x < (y)) x = (y)
#define PB push_back
#define mp make_pair
#define F first
#define S second
#define maxn 200005
#define MOD 1000000007
#define remain(x) if (x > MOD) x -= MOD
#define pii pair<int, int>
#define vi vector<int>
#define vii vector< pii >
#define bit(x, i) (((x) >> (i)) & 1)
#define Task "average"
using namespace std;
typedef long long ll;
typedef long double ld;
long long n;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(); cout.tie();
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
cin >> n;
long long A = n;
long long B = n+1;
long long C = n+n+1;
if (A % 2 == 0) A /= 2;
else B /= 2;
if (A % 3 == 0) A /= 3;
else if (B % 3 == 0) B /= 3;
else C /= 3;
long long res = A % 2021;
res = (res * B) % 2021;
res = (res * C) % 2021;
cout << res;
return 0;
}
Câu 2: Trung bình lớn nhất (6 điểm)
#include <bits/stdc++.h>
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define reset(x) memset(x, 0,sizeof(x))
#define Rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define For(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define MIN(x,y) if (x > (y)) x = (y)
#define MAX(x,y) if (x < (y)) x = (y)
#define PB push_back
#define mp make_pair
#define F first
#define S second
#define maxn 200005
#define MOD 1000000007
#define remain(x) if (x > MOD) x -= MOD
#define pii pair<int, int>
#define vi vector<int>
#define vii vector< pii >
#define bit(x, i) (((x) >> (i)) & 1)
#define Task "average"
using namespace std;
typedef long long ll;
typedef long double ld;
int n, a[maxn], k;
double s[maxn], smin[maxn];
bool check(double ave)
{
For(i, 1, n){
s[i] = s[i-1] + a[i] - ave;
smin[i] = min(smin[i-1], s[i]);
if (i >= k && s[i] >= smin[i-k]) return 1;
4
}
return 0;
}

int main()
{
ios_base::sync_with_stdio(0); cin.tie(); cout.tie();
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
cin >> n >> k;
smin[0] = s[0] = 0;
For(i, 1, n) cin >> a[i];
double L = -1e9, R = 1e9;
while (R - L >= 0.0001)
{
double mid = (R + L)/2;
if (check(mid)) L = mid;
else R = mid;
}
printf("%0.3f", R);
return 0;
}
Câu 3: Phần thưởng (6 điểm)
#include <bits/stdc++.h>
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define reset(x) memset(x, 0,sizeof(x))
#define Rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define For(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define MIN(x,y) if (x > (y)) x = (y)
#define MAX(x,y) if (x < (y)) x = (y)
#define PB push_back
#define mp make_pair
#define F first
#define S second
#define maxn 200005
#define MOD 1000000007
#define remain(x) if (x > MOD) x -= MOD
#define pii pair<int, int>
#define vi vector<int>
#define vii vector< pii >
#define bit(x, i) (((x) >> (i)) & 1)
#define Task "bonus"
using namespace std;
typedef long long ll;
typedef long double ld;
long long n;
int m, k;
int prime[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
long long Calc(int mask){
int g = 1;
for (int i = 0; i < m; i++)
if ((mask >> i) & 1) g *= prime[i];
return n/g;
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(); cout.tie();
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
cin >> n >> k;
m = 0;
while (prime[m] <= k) m++;
long long res = 0;
for (int mask = 1; mask < (1 << m); mask++)
{
int p = __builtin_popcount(mask);
long long num = Calc(mask);
if (p % 2) res += num;
else res -= num;
}
cout << n- res;
return 0;
}
Câu 4: Ghép chữ số (3 điểm)
#include <bits/stdc++.h>
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define reset(x) memset(x, 0,sizeof(x))
#define Rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define For(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define MIN(x,y) if (x > (y)) x = (y)
#define MAX(x,y) if (x < (y)) x = (y)
5
#define PB push_back
#define mp make_pair
#define F first
#define S second
#define maxn 200005
#define MOD 1000000007
#define remain(x) if (x > MOD) x -= MOD
#define pii pair<int, int>
#define vi vector<int>
#define vii vector< pii >
#define bit(x, i) (((x) >> (i)) & 1)
#define Task "digits"
using namespace std;
typedef long long ll;
typedef long double ld;
long long n;
ll x[10];
ll f[20], mu[20];
void Init(){
f[0] = 0;
ll m10 = 1;
mu[0] = 1;
for (int i = 1; i < 18; i++)
{
f[i] = f[i-1] * 10 + m10;
m10 *= 10;
mu[i] = mu[i-1] * 10;
}
}
void Calc(long long num, ll y[]){
reset(y);
for (int i = 0; i < 10; i++) y[i] = 0;
vi cs;
cs.clear();
ll p = num;
while (p > 0){
cs. PB(p % 10);
p /= 10;
}
int m = cs.size();
if (m > 1)
for (int i = 0; i < 10; i++) y[i] = 1;
for (int i = 2; i < m; i++)
{
y[0] += f[i-1] * 9;
for (int j = 1; j < 10; j++) y[j] += f[i-1] * 9 + mu[i-1];
// for (int i = 0; i < 10; i++) cout << y[i] << " ";
// cout << endl;
}
//for (int i = 0; i < 10; i++) cout << y[i] << " ";
long long curnum = 0;
for (int i = m-1; i >= 0; i--){
for (int k = 1; k < cs[i]; k++)
{
y[k] += mu[i];
for (int j = 0; j < 10; j++) y[j] += f[i];
}
curnum += mu[i] * cs[i];
y[cs[i]] += num - curnum + 1;
}
}

bool check(ll mid){


ll z[10];
Calc(mid, z);
For(i, 0, 9)
if (z[i] > x[i]) return 0;
return 1;
}

int main()
{
ios_base::sync_with_stdio(0); cin.tie(); cout.tie();
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
cin >> n;
Init();
For(i, 0, 9) cin >> x[i];
ll z[10];
Calc(n-1,z);
//return 0;
For(i, 0, 9) x[i] += z[i];
long long L = n-1, R = 1000000000000ll;
//long long L = n-1, R = 1000000000000000ll;

6
while (R - L > 1){
long long mid = (R + L)/ 2;
if (check(mid)) L = mid;
else R = mid;
}
cout << L - n + 1;
return 0;
}
2. Cách thức chấm
- Các bài toán được chấm theo test;
- Câu 1, câu 2, câu 3 mỗi câu có 20 test;
- Câu 4 có 10 test;
- Chấm đúng test nào thì được điểm test đó;
Test Điểm Test Điểm
Test01 0.25 Test11 0.25
Test02 0.25 Test12 0.25
Test03 0.25 Test13 0.25
Test04 0.25 Test14 0.25
Test05 0.25 Test15 0.25
Câu 1
Test06 0.25 Test16 0.25
Test07 0.25 Test17 0.25
Test08 0.25 Test18 0.25
Test09 0.25 Test19 0.25
Test10 0.25 Test20 0.25
Tổng điểm 5

Test Điểm Test Điểm


Test01 0.3 Test11 0.3
Test02 0.3 Test12 0.3
Test03 0.3 Test13 0.3
Test04 0.3 Test14 0.3
Test05 0.3 Test15 0.3
Câu 2
Test06 0.3 Test16 0.3
Test07 0.3 Test17 0.3
Test08 0.3 Test18 0.3
Test09 0.3 Test19 0.3
Test10 0.3 Test20 0.3
Tổng điểm 6

Test Điểm Test Điểm


Test01 0.3 Test11 0.3
Test02 0.3 Test12 0.3
Test03 0.3 Test13 0.3
Test04 0.3 Test14 0.3
Test05 0.3 Test15 0.3
Câu 3
Test06 0.3 Test16 0.3
Test07 0.3 Test17 0.3
Test08 0.3 Test18 0.3
Test09 0.3 Test19 0.3
Test10 0.3 Test20 0.3
Tổng điểm 6

Câu 4 Test Điểm Test Điểm


Test01 0.3 Test06 0.3
Test02 0.3 Test07 0.3
Test03 0.3 Test08 0.3
7
Test04 0.3 Test09 0.3
Test05 0.3 Test10 0.3
Tổng điểm 3

Hưng Yên, ngày 10 tháng 01 năm 2021


NGƯỜI BIÊN SOẠN ĐỀ

Nguyễn Văn Hiếu

Hà Văn Cường

You might also like