Professional Documents
Culture Documents
11
I.01 – Ba số ................................................................................................................................... 11
I.02 – Tam giác vuông ................................................................................................................ 11
I.03 – Chia mận ............................................................................................................................ 11
I.04 – Đồng hồ điện tử ............................................................................................................... 12
I.05 – Trước và sau ..................................................................................................................... 12
I.06 – Số bàn học ......................................................................................................................... 13
I.07 – Tổng các số lẻ................................................................................................................... 13
I.08 – An ninh lương thực......................................................................................................... 14
I.09 – Gặp nhau ............................................................................................................................ 14
I.10 – Khoảng cách ..................................................................................................................... 14
I.11 – Đuổi kịp............................................................................................................................... 15
I.12 – Phương trình bậc 3 ......................................................................................................... 15
I.13 – Lát sân ................................................................................................................................ 16
I.14 – Du lịch Phanxipan ............................................................................................................ 17
I.15 – Xuất khẩu gạo ................................................................................................................... 17
I.16 – Chữ số hàng đơn vị ........................................................................................................ 18
I.17 – Chữ số lẻ đầu tiên ........................................................................................................... 18
I.18 – Chữ số lẻ thứ k ................................................................................................................. 18
I.19 – Bữa tối ................................................................................................................................ 19
I.20 – Hamburger ......................................................................................................................... 19
I.21 – Tôm sú ................................................................................................................................ 19
I.22 – Thời gian ............................................................................................................................. 20
I.23 – Gửi tiết kiệm ....................................................................................................................... 20
................................................................................................................................ 21
.................................................................................................................... 21
................................................................................................... 22
II.01 – Số lớn nhất ....................................................................................................................... 22
II.02 – Dấu của tổng .................................................................................................................... 22
II.03 – Bàn cờ ............................................................................................................................... 23
II.04 – Năm nhuận ....................................................................................................................... 23
..................................................... 86
................................................................ 87
............................................................................................. 87
...................................................................................................................... 88
.................................................................................... 89
................................................................................................................... 89
............................................................................................................................. 91
..................................................................................................................... 91
............................................................................................................................... 92
................................................................................................................ 93
........................................................................................................................ 94
............................................................................................................ 95
................................................................................................................. 96
................................................................................................. 97
I.01_S – Ba số............................................................................................................................... 97
I.02_S – Tam giác vuông ........................................................................................................... 97
I.03_S – Chia mận ....................................................................................................................... 97
I.04_S – Đồng hồ điện tử ............................................................................................................ 98
I.06_S – Số bàn học .................................................................................................................... 98
I.07_S – Tổng các số lẻ .............................................................................................................. 98
I.08_S – An ninh lương thực .................................................................................................... 99
I.09_S – Gặp nhau ....................................................................................................................... 99
I.10_S – Khoảng cách ................................................................................................................ 99
I.11_S – Đuổi kịp........................................................................................................................ 100
I.12_S – Phương trình bậc 3 .................................................................................................. 100
I.13_S – Lát sân ......................................................................................................................... 100
I.14_S – Du lịch Phanxipan ..................................................................................................... 100
I.15_S – Xuất khẩu gạo ............................................................................................................ 101
I.16_S – Chữ số hàng đơn vị.................................................................................................. 101
I.17_S – Chữ số lẻ đầu tiên..................................................................................................... 101
I.18_S – Chữ số lẻ thứ k .......................................................................................................... 102
I>19_S – Bữa tối ........................................................................................................................ 102
I.20_S – Hamburger .................................................................................................................. 102
I.21_S – Tôm sú ......................................................................................................................... 102
I.22_S – Thời gian ...................................................................................................................... 102
I.23_S – Gửi tiết kiệm ............................................................................................................... 103
I.24_S – Số chữ số .................................................................................................................... 103
.................................................................................................................. 104
................................................................................................. 105
II.01_S – Số lớn nhất ................................................................................................................ 105
II.02_S – Dấu của tổng ............................................................................................................. 105
II.03_S – Bàn cờ......................................................................................................................... 106
II.04_S – Năm nhuận................................................................................................................. 106
II.05_S – Tích lớn nhất ............................................................................................................. 106
II06_S – Giống nhau .................................................................................................................. 106
II.07_S – Quân hậu ..................................................................................................................... 107
............................................................................................ 185
...................................................................................................... 188
.............................................. 190
......................................................... 191
........................................................................................... 193
............................................................................................................... 195
.............................................................................. 197
............................................................................................................ 198
....................................................................................................................... 199
.............................................................................................................. 204
........................................................................................................................ 206
........................................................................................................ 206
.................................................................................................................. 210
...................................................................................................... 212
.......................................................................................................... 214
Dữ liệu nhập vào từ bàn phím, kết quả - đưa ra màn hình.
Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và trước mỗi kết
quả, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu.
Ví dụ:
INPUT OUTPUT
b = 3 Diện tích tam giác: 6.0
c = 4 Độ dài cạnh huyền: 5.0
INPUT OUTPUT
n = 1875 7 15
Chiều dài của viên gạch song song với cạnh dài
của sân. Mỗi viên gạch nguyên ở hàng tiếp theo
được đặt lệch 1 đơn vị so vớiviên gạch nguyên kề
cạnh ở hàng trên. Toàn sân phải lát kín vì vậy có n=8
thể phải chặt đôi một số viên gạch ban đầu thành
2 viên gạch kích thước 1×1.
Hãy xác định số viên gạch cần mua và trong số đó có bao nhiêu viên gạch cần
chặt đôi.
Các số nguyên n, m được nhập vào từ bàn phím. Kết quả tính được đưa ra trên
một dòng của màn hình, hai số cách nhau một dấu cách.
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và trước mỗi kết
quả, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu).
Ví dụ:
INPUT OUTPUT
m = 5 Result: 20 2
n = 8
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và trước mỗi kết
quả, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu).
Ví dụ:
INPUT OUTPUT
a = 45 Result = 8
b = 17
k = 6
Ví dụ:
INPUT OUTPUT
d = 92 Result = 4
m = 30
I.20 – Hamburger
Bánh hamburger là món ăn trưa phổ biến của người Mỹ. Một chiếc hamburger
giá a USD và b Cent (1 USD = 100 Cent). Văn phòng gọi điện đặt mang đến n
chiếc bánh. Hãy xác định cần phải chuẩn bị bao nhiêu đô la và bao nhiêu Cent để
thanh toán. Lưu ý số cent cần chuẩn bị phải nhỏ hơn 100.
Các số nguyên không âm a, b và n được nhập vào từ bàn phím. Kết quả - đưa ra
màn hình.
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và trước mỗi kết
quả, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu).
Ví dụ:
INPUT OUTPUT
s = 6 48 10 Result = 66 . 80 USD
I.21 – Tôm sú
Tôm sú được bóc vỏ, loại bỏ đầu và đóng thành từng khay, mỗi khay 10 con. Cứ
10 khay được đóng thành một thùng giấy để xuất khẩu.
Lô hàng đưa vào khâu chế biến và đóng gói có n con.
Hãy xác định còn bao nhiêu khay chưa được đóng vào thùng và bao nhiêu con
chưa được đóng vào khay sau khi chế biến xong toàn bộ tôm chuyển tới.
Tam giác Pascal xác định các hệ số của việc triển khai nhị thức (a+b)k.
Phần tử thứ m ở dòng n (m ≤ n) là tổ hợp chập m của n ( 𝐶𝑛𝑚 ). 1
1 1
Cho m và n 0 ≤ m ≤ n. Hãy xác định phần tử thứ m trên dòng n 1 2 1
1 3 3 1
của tam giác Pascal. 1 4 6 4 1
Dữ liệu: vào từ thiết bị vào chuẩn của hệ thống, gồm một dòng
chứa 2 nguyên không âm m và n.
Kết quả: : đưa ra thiết bị ra chuẩn của hệ thống số nguyên tìm được.
Ví dụ:
INPUT OUTPUT
3 5 10
INPUT OUTPUT
6 10 4 Max = 10
INPUT OUTPUT
Size: 4 6 B
Cell: 3 4
INPUT OUTPUT
n = 6656 Multi leap
INPUT OUTPUT
n = 2020 Leap
INPUT OUTPUT
p1 = 30000 Result: 0
p2 = 40000
p3 = 50000
INPUT OUTPUT
p1 = 18000 Result: 3
p2 = 18000
p3 = 18000
Hãy xác định, từ vị trí đã cho quân hậu có thể tới ô A được 1
hay không và đưa ra màn hình thông báo tương ứng YES 1 2 3 4 5 6
hoặc NO. Dữ liệu được đưa vào từ bàn phím gồm 2 dòng, mỗi dòng chứa hai số
nguyên xác định tọa độ một ô và đảm bảo ô thuộc bàn cờ.
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu, Python cho phép
đưa ra chú thích dưới dạng tiếng Việt có dấu).
Ví dụ:
INPUT OUTPUT
sq = 2 2 Yes
sa = 1 3
II.08 – Sô cô la
Thanh sô cô la hình chữ nhật được chia thành các miếng nhỏ bằng n-1 đường
rãnh theo chiều dọc và m-1 rãnh theo chiều ngang để giúp
người dùng dễ bẻ.
Hãy xác định có thể một lần bẻ theo chiều ngang hoặc
theo chiều dọc để tách thanh sô cô la thành 2 phần, trong
đó một phần có đúng k miếng nhỏ và đưa ra màn hình thông báo YES trong
trường hợp bẻ được hoặc NO trong trường hợp ngược lại.
Các số nguyên m, n và k được nhập vào từ bàn phím.
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và trước mỗi kết
quả, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu).
Ví dụ:
INPUT OUTPUT
sz = 4 6 Yes
k = 8
II.09 – Bể bơi
Alice là thành viên đội tuyển bơi nghệ thuật. Cô thường xuyên rèn luyên, tập các
động tác cơ bản ở bể bơi của câu lạc bộ. Bể bơi hình chữ nhật, kích thước m×n
mét. Sau một thời gian tập, thấm mệt, cô muốn vịn vào thành bể để nghỉ. Nhìn về
phía thành dài hơn cô thấy mình còn cách x mét (không nhất thiết là khoảng cách
nhỏ nhất tới thành dài) và cô còn cách thành ngắn y mét. Hãy xác định quảng
đường ngắn nhất cần bơi để tới thành bể.
Các số nguyên n, m, x, y được nhập từ bàn phím, dữ liệu hợp lệ đảm bảo Alice
đang trong bể bơi. Đưa ra màn hình độ dài đoạn đường ngắn nhất cần bơi.
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và trước mỗi kết
quả, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu).
INPUT OUTPUT
m = 60 Result = 0
v = 12
t = 5
d = C
Cấp số cộng là dãy số, trong đó, trừ phần tử đầu tiên, mỗi số đứng sau bằng số
đứng nó cộng d với d là chung cho mọi phần tử của dãy. Ví dụ, 3, 5, 7, 9 là một
cấp số cộng với d = 2.
Cấp số nhân là dãy số, trong đó, trừ phần tử đầu tiên, mỗi số đứng sau bằng số
đứng nó nhân q với q là chung cho mọi phần tử của dãy. Ví dụ, 1, 3, 9, 27 là một
cấp số nhân với q = 3.
Ví dụ:
INPUT OUTPUT
a = 5 64 49 36 25
b = 8
Ví dụ:
INPUT OUTPUT
a = 6 9 16 25
b = 30
III.08 – Số bị thiếu
Cho số nguyên n, n > 1. Nhập vào n-1 số nguyên khác nhau từng đôi một, mỗi
số nằm trong phạm vi từ 1 đến n.
Hãy đưa ra số nguyên x, 1 ≤ x ≤ n không có mặt trong danh sách các số đã nhập
vào.
Dữ liệu: Nhập vào từ thiết bị vào chuẩn của hệ thống, dòng đầu tiên chứa số
nguyên n, mỗi dòng trong n-1 dòng sau chứa một số nguyên cần nhập.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống một số nguyên – số bị thiếu trong
danh sách.
(Có thể đưa ra chú thích tùy chọn trước mỗi phép nhập dữ liệu và ở kết quả đưa
ra, Python cho phép đưa ra chú thích dưới dạng tiếng Việt có dấu).
Ví dụ:
INPUT OUTPUT
n = 6 Số bị thiếu: 5
4
6
1
3
2
IV.04 – Vị trí ký tự
Cho xâu s và ký tự c.
Nếu c xuất hiện trong s một lần – đưa ra vị trí của c trong s.
Nếu c xuất hiện nhiều lần trong s – đưa ra vị trí xuất hiện lần đầu tiên và lần cuối
cùng của c trong s.
Nếu s không chứa c – đưa ra giá trị -1.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
INPUT OUTPUT
abcdefgh 4
e
INPUT OUTPUT
12345678 -1
a
Cho xâu s và ký tự c.
Nếu ký tự c xuất hiện trong s nhiều hơn một lần – đưa ra vị trí xuất hiện lần thứ
2, nếu c chỉ xuất hiện một lần – đưa ra -1, nếu s không chứa c – đưa ra -2.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
123423456234 4
2
INPUT OUTPUT
123456789 -1
2
INPUT OUTPUT
123456 -2
a
Cho xâu s và ký tự c.
Nếu c xuất hiện nhiều hơn một lần trong s thì xóa khỏi s xâu con các ký tự liên
tiếp nhau bắt đầu lần xuất hiện đầu tiên của c cho đến lần xuất hiện cuối cùng
của ký tự này.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
abc2efgh2ijk2lmn abclmn
2
INPUT OUTPUT
Abcdefgh abcdefgh
5
Cho xâu s. Tạo xâu mới từ s bằng cách thay các ký tự ‘1’ và thay nó bằng xâu
‘one’ và giữ nguyên các ký tự còn lại.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
32154198176 32one54one98one76
IV.09 – Xóa ký tự
Cho xâu s. Tạo xâu mới từ s bằng cách xóa các ký tự tại các vị trí chia hết cho
3.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
12345678901234 235689124
Cho văn bản t. Tìm và thay thể trong t xâu con w_old bằng xâu con w_new.
Viêc thay thế sẽ được thực hiện cho đến khi văn bản không còn chứa w_old.
Dữ liệu vào:
Dòng thứ nhất chứa văn bản t,
Dòng thứ hai chứa xâu w_old,
Dòng thứ hai chứa xâu w_new.
Hãy đưa ra văn bản sau khi thay thế.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
Bbc Aaa bBbc aBbcaaBbc DEF BBC Aaa bBBC aBBCaaBBC DEF
Bbc
BBC
Tạo 2 số thực ngẫu nhiên, mỗi số có 6 chữ số sau dấu chấm thập phân.
Tìm và đưa ra chữ số lớn nhất của tích 2 số tạo được.
Cho văn bản gồm các từ ghi trên một dòng. Từ là đoạn các ký tự liên tiếp không
chứa dấu cách. Các từ cách nhau ít nhất một dấu cách.
Hãy đưa ra từ có độ dài lớn nhất và độ dài của từ đó.
Dữ liệu: Nhập văn bản vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được trên một dòng
gồm từ và độ dài từ tìm được, hai đại lượng ghi cách nhau một dấu cách.
Ví dụ:
INPUT OUTPUT
a2 b12 c d01 e123456 d089 e123456 7
Palindrome là xâu mà kết quả đọc các ký tự từ trái sang phải giống kết quả đọc
các ký tự từ phải sang trái.
Ví dụ s = ‘12344321’ là xâu palindrome.
Xét xâu chứa các ký tự có mã ASCII lớn hơn hoặc bằng 32.
Hãy đưa ra thông báo Yes nếu đó là xâu palindrome hoặc No trong trường hợp
ngược lại.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
AbdcdbA hi ih AbdcdbA Yes
Từ số nguyên không âm cho trước tạo số mới bằng cách cộng nó với số nhận
được bằng cách đảo ngược vị trí các chữ số, nếu tổng hai số này chưa có dạng
palindrome thì áp dụng các phép biến đổi trên cho đến khi nhận được số dạng
palindrome và đưa ra số nhận được.
Số có dạng palindrome là số khi đọc các chữ số từ trái sang phải ta được kết quả
như khi đọc từ phải sang trái. Ví dụ 20902 là một số dạng palindrome.
Dữ liệu: Nhập số nguyên n vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
91 121
Cho một xâu chứa số nguyên và kết thúc bằng ký tự chỉ thang nhiệt độ. Ký tự chỉ
thang nhiệt độ là c hoặc C cho biết đó là nhiệt độ Celsius. Nếu ký tự chỉ thang
nhiệt độ là f hoặc F cho biết đó là nhiệt độ Fahrenheit.
Hãy nhận dạng thang nhiệt độ và đưa ra nhiệt độ tương ứng ở thang kia với độ
chính xác 2 chữ số sau dấu chấm thập phân.
Dữ liệu: Nhập xâu s vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
100c 212F
INPUT OUTPUT
98.60F 37.00C
Một doanh nghiệp càng đóng thuế nhiều bao nhiêu vào ngân sách nhà nước thì
doanh nghiệp đó càng qua trọng trên quan điểm kinh tế thuần túy. Số tiền thuế
đóng năm vừa qua của các doanh nghiệp được ghi nhận trong danh sách, sắp xếp
theo thứ tự không tăng.
Một doanh nghiệp mới thành lập, dự kiến sẽ mang lại x đồng/năm tiền thuế cho
ngân sách. Cần bổ sung tên doanh nghiệp này vào danh sách đã lập sao cho vẫn
đảm bảo thứ tự không tăng theo thuế đóng góp. Nếu đã có nhiều doanh nghiệp có
cùng số đóng góp là x thì doanh nghiệp mới được ghi vào vị trí sau các doanh
nghiệp này.
Đưa ra vị trí của doanh nghiệp mới. Các vị trí trong danh sách được đánh số bắt
đầu từ 0.
Dữ liệu: Nhập từ thiết bị vào chuẩn của hệ thống:
Dòng đầu tiên chứa danh sách số tiền thuế theo thứ tự giảm dần của các doanh
nghiệp hiện có,
Dòng thứ 2 chứa một số nguyên – tiền đóng thuế của doanh nghiệp mới.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống vị trí cần bổ sung doanh nghiệp
mới vào danh sách.
Ví dụ:
INPUT OUTPUT
512 128 126 100 100 100 98 90 6
100
Cho mảng chứa các số nguyên đã sắp xếp theo thứ tự không giảm hoặc không
tăng.
Hãy xác định mảng chứa bao nhiêu phần tử có giá trị khác nhau từng đôi một.
Dữ liệu: Nhập mảng số a vào từ thiết bị vào chuẩn của hệ thống.
Cho mảng a chứa các phần tử nguyên. Hãy đổi chổ các cặp phần tử a0 với a1, a2
với a3, . . . Nếu kích thước a là lẻ thì phần tử cuối cùng vẫn giữ nguyên vị trí.
Hãy đưa ra trên một dòng các phần tử của mảng sau khi đổi chổ.
Dữ liệu: Nhập mảng số a vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
1 2 3 4 5 6 7 8 9 2 1 4 3 6 5 8 7 9
Cho mảng a chứa các phần tử nguyên khác nhau từng đôi một. Hãy đổi chổ vị trí
của phần tử giá trị nhỏ nhất và phần tử giá trị lớn nhất trong mảng.
Hãy đưa ra trên một dòng các phần tử của mảng sau khi đổi chổ.
Dữ liệu: Nhập mảng số a vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
6 1 3 2 8 7 9 4 5 6 9 3 2 8 7 1 4 5
Cho mảng số nguyên a. Hãy xác định có bao nhiêu cặp phần tử trùng nhau trong
dãy.
Dữ liệu: Nhập mảng số a vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
2 4 2 5 3 5 2 5 6
Camera đặt cạnh đường cao tốc ghi nhận nhiều thông tin, trong đó có mảng số
nhận dạng loại ô tô đi qua. Mỗi loại ô tô được mã hóa thành một số nguyên.
Cho mảng số nhận dạng loại ô tô. Hãy xác định đã có bao nhiêu loại xe khác nhau
được nhận dạng
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
2 4 2 5 4 5 2 5 4 5 5 3
V.16 – Bowling
Bowling là trò chơi ném bóng làm đổ các con ki (chai gỗ - quille) được xếp thành
một hàng ngang.
Các con ki được đánh số từ 1 đến n từ trái sang phải.
Một người ném bóng n lượt, lượt thứ i làm đổ các con ki từ
lfi đến rti, kể cả lfi và rti, 1 ≤ lfi ≤ rti ≤ n, i = 1 ÷
k.
Hãy đưa ra n ký tự liên tiếp nhau trên một dòng, ký tự thứ i
là ‘I’ nếu con ki thứ i chưa bị đổ và là ‘.’ Trong trường hợp ngược lại.
Khởi tạo dãy n số nguyên, mỗi số là một số ngẫu nhiên nằm trong đoạn [a, b].
Đưa ra dãy số đã khởi tạo
Đếm và đưa ra số lượng số lẻ âm, số lượng số chẵn âm, số lượng số lẻ dương và
số lượng số chẵn dương.
Dữ liệu vào từ thiết bị vào chuẩn của hệ thống:
Dòng đầu tiên chứa số nguyên dương n,
Dòng thứ 2 chứa 2 số a và b.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được theo quy cách
nêu trong ví dụ.
Cho mảng a chứa các giá trị nguyên. Mảng b gọi là đại diện cho a nếu các phần
tử giống nhau trong a chỉ được lưu một lần trong b và mọi phần tử của a đều có
một phần tử bằng nó trong b.
Cho 2 điểm trên mặt phẳng, điểm A có tọa độ (xa, ya), điểm B có tọa độ (xb,
yb). Các tọa độ nhận giá trị thực.
Khoảng cách Euclide dA,B được tính theo công thức:
dA,B = √(𝑥𝑎 − 𝑥𝑏)2 + (𝑦𝑎 − 𝑦𝑏)2
Xây dựng hàm tính khoảng cách dA,B.
Nhập tọa độ 3 điểm A, B, C trên mặt phẳng. Sử dụng hàm nói trên để tìm và đưa
ra độ dài cạnh ngắn nhất của ABC (ABC có thể suy biến).
Kết quả đưa ra với độ chính xác 6 chữ số sau dấu
chấm thập phân. Oy B
Ví dụ:
INPUT OUTPUT A Ox
-2 -1 4.609772
3.5 2
2.5 -2.5 C
Hãy xây dựng hàm fpower(a,n,p) tính nhanh giá trị an theo mô đun p với
a, n, p là các số nguyên dương.
Nhập các số nguyên dương x, y, và z. Sử dụng hàm đã xây dựng để đưa ra giá
trị xy theo mô đun z.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Hãy xây dựng hàm fmult(x,y,p) tính nhanh giá trị x*y theo mô đun p với
x, y, p là các số nguyên dương.
Nhập các số nguyên dương a, b, và c. Sử dụng hàm đã xây dựng để đưa ra giá
trị a*b theo mô đun c.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
95 11 100 45
Xây dựng các hàm lower_bound và upper_bound với tham số là danh sách
đã sắp xếp không giảm và giá trị val, hàm lower_bound trả về vị trí của phần
tử lớn nhất trong a không nhỏ hơn val, hàm upper_bound trả về vị trí của
phần tử nhỏ nhất trong a lớn hơn val.
Trong trường hợp không tồn tại vị trí cần tìm, hàm lower_bound trả về vị trí
-1, hàm upper_bound trả về vị trí len(a).
Viết chương trình nhập b = (b1, b2, . . ., bn) và giá trị v, gọi các hàm nói trên,
đưa ra vị trí và giá trị phần tử b tương ứng.
Dữ liệu vào từ thiết bị vào chuẩn của hệ thống:
Dòng dầu tiên chứa số nguyên n,
Dòng thứ 2 chứa n số nguyên b1, b2, . . ., bn, bi ≤ bi+1, i = 1 ÷ n-1,
Dòng thứ 3 chứa số nguyên v.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống 2 dòng, mỗi dòng chứa 2 số nguyên
– chỉ số và giá trị phần tử b tương ứng.
Xây dựng hàm kiểm tra các số trong mảng số nguyên a khác nhau từng đôi một
hay không, trả về kết quả 1 nếu các số khác nhau từng đôi một và 0 trong trường
hợp ngược lại.
Cho n, m và bảng a kích thước n×m (n dòng, m cột), mỗi phần tử của bảng là một
số nguyên. Hãy chỉ ra tọa độ dòng và cột của phần tử lớn nhất trong bảng. Nếu
có nhiều phần tử cùng đạt max thì đưa ra tọa độ của phần tử ở dòng có chỉ số nhỏ
nhất. Nếu trong dòng này có nhiều phần tử cùng đạt max thì đưa ra tọa độ phần
tử có cột nhỏ nhất.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
3 4 1 2
4 2 3 5
1 5 6 2
0 5 3 4
Cho n là một số nguyên dương lẻ, vẽ hình bông tuyết kích thước n×n bằng cách
tạo bảng a kích thước n×n, mỗi phần tử là một ký tự ‘.’, sau đó thay các ký tự
trên đường chéo chính, đường chéo phụ, trên cột giữa và hàng giữa của bảng bằng
ký tự ‘*’.
Đưa ra bảng a nhận được.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
5 * . * . *
. * * * .
* * * * *
. * * * .
* . * . *
Xét mảng a kích thước n×m, trong đó n – số hàng, m – số cột, ai,j nhận giá trị
nguyên.
Cho 2 số nguyên p và q (0 ≤ p, q < m, p ≠ q).
Hãy xây dựng hàm đổi chổ 2 cột u và v của a và gọi hàm để đổi chổ 2 cột p, q
của a. Đưa ra mảng a sau biến đổi.
Dữ liệu: vào từ thiết bị vào chuẩn:
Dòng đầu tiên chứa 2 số nguyên dương n và m,
Mỗi dòng trong n dòng sau chứa m số nguyên xác định một dòng của a,
các số trên một dòng cách nhau một dấu cách,
Dòng cuối cùng chứa 2 số nguyên p và q (0 ≤ p, q < m, p ≠ q).
Kết quả: Đưa ra thiết bị ra chuẩn mảng nhận được sau biến đổi.
Ví dụ:
INPUT OUTPUT
5 6 0 0 0 0 0 1
0 0 0 0 0 1 0 1 0 0 0 2
0 0 0 0 1 2 0 2 0 1 0 2
0 0 0 1 2 2 0 2 1 2 0 2
0 0 1 2 2 2 0 2 2 2 1 2
0 1 2 2 2 2
1 4
Lập trình tạo ma trận b kích thước m×n (m hàng, n cột), mỗi phần tử là một số
ngẫu nhiên trong phạm vi từ x đến y.
INPUT OUTPUT
5 6 28 18 17 8 18 7
5 30 14 16 24 8 11 8
10 8 24 30 16 22 22
20 20 23 28 16 27
23 16 16 27 18 11
Total: 0
Xét mảng 2 chiều Am×n ( m hàng và n cột), mỗi phần tử của mảng là một số
nguyên. Hãy xác định cột có tổng giá trị các phần trên cột là lớn nhất, hàng có
tổng giá trị các phần trên hàng là lớn nhất. Tính và đưa ra tổng các phần tử trên
hàng và cột tìm được.
Dữ liệu: vào từ thiết bị vào chuẩn:
Dòng đầu tiên chứa 2 số nguyên m và n,
Mỗi dòng trong m dòng sau chứa n số nguyên xác định một hàng của bảng,
các số ghi cách nhau ít nhất một dấu cách,
Kết quả: Đưa ra thiết bị ra chuẩn một số nguyên – tổng tìm được.
Xét danh sách a chứa các phần tử có thể cùng hoặc khác kiểu dữ liệu.
Hãy đưa ra số lượng phần tử khác nhau của a.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
5 -12.6 5 swan 5 swan 12.6 4
Xét các phần tử ở 2 danh sách và đưa số lượng phần tử đồng thời có mặt ở cả hai
danh sách đã cho.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
5 -12.6 5 swan 5 swan 12.6 2
duck swan 12.6 duck duck 12.6
Xét các phần tử ở 2 danh sách và đưa các phần tử đồng thời có mặt ở cả hai danh
sách đã cho theo thứ tự sắp xếp tăng dần.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
5 -12.6 5 swan 5 swan 12.6 12.6 swan
duck swan 12.6 duck duck 12.6
Đọc lần lượt từ đầu đến cuối các số của một dãy số nguyên, với mỗi số đưa ra
thông báo NEW nếu đó là số mới, chưa gặp lần nào trong quá trình đọc hoặc OLD
trong trường hợp ngược lại.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
5 8 1 5 2 8 2 6 NEW NEW NEW OLD NEW OLD OLD NEW
Ở Oslo Na Uy và NewYork Mỹ đề có Viện bảo tàng gen, lưu trữ gen thực động
vật đã có trên thế giới. Các gen được mã hóa theo quy tắc chung, mỗi loại gen
được đặt tương ứng với một số nguyên trong phạm vi từ 1 đến 108.
Trong một dự án khoa học hai Viện hợp tác, trao đổi và phối hợp với nhau cùng
phát hiện và bảo vệ các gen quý.
Việc đầu tiên cần làm là xác định những gen nào cùng có ở cả 2 Viện, những gen
chỉ có ở Viện Oslo và những gen chỉ có ở Viện NewYork.
Hãy xác định số lượng và chỉ ra cụ thể các gen trong mỗi tập đã nêu.
Dữ liệu vào từ thiết bị vào chuẩn của hệ thống:
Dòng đầu tiên chứa 2 số nguyên n và m – số lượng gen có Viện Oslo và ở
Viện NewYork,
n số tiếp theo, mỗi số trên một dòng xác định các gen lưu Viện Oslo,
m số tiếp theo, mỗi số trên một dòng xác định các gen lưu Viện NewYork.
Kết quả đưa ra thiết bị ra chuẩn của hệ thống:
Dòng thứ nhất chứa số nguyên xác định số lượng gen có ở cả hai Viện,
Dòng thứ 2: ghi các gen có chung,
Dòng thứ 3: chứa số nguyên xác định số lượng gen chỉ có ở Oslo,
Dòng thứ 4: ghi các gen chỉ có ở Oslo,
Dòng thứ 5: chứa số nguyên xác định số lượng gen chỉ có ở NewYork,
Dòng thứ 6: ghi các gen chỉ có ở NewYork.
INPUT OUTPUT
5 8 4
2 6 5 4 9 4 5 6 9
1 10 6 4 5 7 8 9 1
2
4
1 7 8 10
VIII.06 – Số lượng từ
Xét một số xâu, mỗi xâu chứa các từ. Từ là dãy ký tự liên tiếp không chứa dấu
cách. Các từ trong xâu cách nhau một hoặc nhiều dấu cách. Trước từ đầu tiên và
sau từ cuối cùng có thể không có dấu cách.
Thông tin về văn bản bắt đầu bằng dòng chứa một số nguyên xác định số dòng
trong văn bản, các dòng tiếp theo chứa xâu trong văn bản.
Hãy xác định văn bản chứa bao nhiêu từ.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
3 13
12 345 6 7 890
a bc def gh
dxy ljm lkmnb gtr
VIII.07 – Đoán số
Trong thời gian bị cách ly vì COVID các bạn trẻ có rất nhiều thời gian rãnh và
thường tổ chức các trò chơi qua mạng.
Alice báo cho Bob là mình nghĩ một số nguyên dương không vượt quá n trong
đầu và đề xuất Bob tìm ra số đó bằng cách nêu một tập số, Alice sẽ trả lời Yes
nếu tập đó chứa số cần đoán và No trong trường hợp ngược lại.
Với chiến lược đúng Bob có thể tìm được câu trả lời sau không quá logn lần đoán.
Đáng tiếc, Bob say mê đủ mọi thứ, trừ tin học. Sau một số lần đoán, Bob xin chịu
Ví dụ:
INPUT OUTPUT
5 1
3 English
French 7
Rusian Arab
English Chiness
2 Deuch
English English
Rusian French
3 Latin
English Rusian
Arab
Latin
2
Chiness
English
3
Deuch
French
English
Russian
Nhập dãy số nguyên, các số của dãy ghi trên một dòng, cách nhau ít nhất một dấu
cách.
Tìm và đưa ra số xuất hiện nhiều nhất trong dãy số cùng số lần xuất hiện.
Nếu tồn tại nhiều số khác nhau cùng xuất hiện nhiếu lần như nhau – đưa ra số có
giá trị nhỏ nhất.
Dữ liệu: Nhập dữ liệu vào từ thiết bị vào chuẩn của hệ thống.
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống kết quả nhận được.
Ví dụ:
INPUT OUTPUT
4 4 3 4 2 3 4 2 3 6 2 3 2 3 2 8 2 5
INPUT.TXT OUTPUT.TXT
3 10 4
10 2 3 5 7
30
100 30 10
2 3 5 7 11 13 17 19 23 29
100 25
2 3 5 7 11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89 97
Ngoài việc tìm ước số chung lớn nhất (gcd) của 2 số a và b, nhiều khi ta còn phải
biết các hệ số thể hiện gcd qua a và b, tức là phải tìm x và y thỏa mãn
a×x + b×y = gcd(a,b)
Với a và b đã cho, hãy tìm một cặp số nguyên x và y thỏa mãn điều kiện nêu
trên.
Dữ liệu: vào từ file văn bản INPUT.TXT gồm một dòng chứa 2 số nguyên a và
b.
Kết quả: đưa ra file văn bản OUTPUT.TXT các số x, y và gcd(a,b) trên một
dòng.
Các số ghi trên một dòng cách nhau một dấu cách.
Ví dụ:
INPUT.TXT OUTPUT.TXT
25 15 -1 2 5
Cho số nguyên tố m. Hãy tìm nghịch đảo theo mô đun m của mỗi số trong đoạn
[1..m-1].
Dữ liệu: vào từ file văn bản INPUT.TXT gồm một dòng chứa số nguyên m.
Kết quả: đưa ra file văn bản OUTPUT.TXT m-1 số nguyên – các nghịch đảo tìm
được, các số ghi cách nhau một dấu cách.
Ví dụ:
INPUT.TXT OUTPUT.TXT
11 1 6 4 3 9 2 8 7 5 10
INPUT.TXT OUTPUT.TXT
3 43 100 5
INPUT.TXT OUTPUT.TXT
4 10 12 -12 6
Cho các số nguyên a, b, n (n > 0). Hãy tìm các số nguyên x trong đoạn [0, n-1]
thỏa mãn điều kiện a×x = b (mod n).
Dữ liệu: Vào từ file văn bản INPUT.TXT gồm một dòng chứa 3 số nguyên a, b và
n (0 ≤ a, b ≤ 109, 0 < n ≤ 2×109 ).
Kết quả: Đưa ra file văn bản OUTPUT.TXT:
Dòng đầu tiên chứa số nguyên k – số lượng số tìm được,
Nếu k > 0: Dòng thứ 2 chứa k số thỏa mãn điều kiện bài toán.
Ví dụ:
INPUT.TXT OUTPUT.TXT
5 9 13 1
7
Cho các số nguyên dương n và k. Hãy tìm số nguyên x lớn nhất thỏa mãn điều
kiện n! chia hết cho kx.
Dữ liệu: Vào từ file văn bản INPUT.TXT gồm một dòng chứa 2 số nguyên n và
k (1 ≤ n ≤ 109, 1 < k ≤ 1015).
Kết quả: Đưa ra file văn bản OUTPUT.TXT số nguyên x tìm được.
Ví dụ:
INPUT.TXT OUTPUT.TXT
6 3 2
INPUT.TXT OUTPUT.TXT
10 5 2
INPUT.TXT OUTPUT.TXT
10 3
Kết quả:
Ví dụ:
6 3 7 3
3 5 6
Thủy triều đỏ là một thuật ngữ thông dụng được dùng để chỉ một trong một loạt
các hiện tượng tự nhiên được gọi là tảo nở hoa gây hại hay HABs (viết tắt của
cụm từ tiếng anh Harmful Algal Blooms). Thuật ngữ Thủy triều đỏ được sử dụng
đặc biệt để đề cập đến sự nở hoa của một loài tảo có tên là Karenia brevis. Thủy
triều đỏ gây tác hại lớn cho môi trường vì nó dẫn đến cái chết hàng loạt của nhiều
loại sinh vật biển.
Cứ mỗi chu kỳ sinh sản mỗi cá thể tảo phát triển thành a cá thể. Phụ thuộc vào
nhiệt độ và nồng độ các chất hữu cơ hòa tan trong nước, tảo Karenia brevis có
thể phát triển nhanh hay chậm, vì vậy hệ số phát triển a không cố định mà thay
đổi theo từng chu kỳ phát triển.
Ở m vùng biển có hiện tượng thủy triều đỏ các nhà khoa học lấy mẫu nước và ước
lượng số cá thể tảo độc trong một đơn vị thể tích của từng mẫu, mẫu nước thứ i
có bi cá thể, i = 1 ÷ m. Ở mức vô hại, ban đầu trong mỗi đơn vị thể tích nước chỉ
có thể có một cá thể. Người ta muốn biết nhiều nhất có bao nhiêu chu kỳ sinh sản
đã xẩy ra, từ đó liên hệ với các yếu tố môi trường để tìm ra nguyên nhân chính
gây ra thảm họa môi trường.
INPUT.TXT OUTPUT.TXT
4 3
20 108 896045556 231 2 2 5
5
2 2 3 3 3
7
2 2 3 7 7 163 9349
3
3 7 11
Xét xâu chỉ chứa các ký tự ngoặc tròn ( và ). Xâu tạo thành một biểu thức ngoặc
đúng nếu thỏa mãn điều kiện định nghĩa biểu thức ngoặc đúng:
Xâu rỗng là một biểu thức ngoặc đúng,
Nếu A là biểu thức ngoặc đúng thì (A) cũng là một biểu thức ngoặc đúng,
Nếu A và B là các biểu thức ngoặc đúng thì AB cũng là một biểu thức ngoặc
đúng.
Xét biểu thức ngoặc đúng độ dài 2×n. Biểu thức sẽ chứa n ngoặc mở và n ngoặc
đóng. Mỗi ngoặc mở sẽ tương ứng với đúng một ngoặc đóng mà xâu con các ký
tự giữa 2 ngoặc này là một biểu thức ngoặc đúng, 2 ngoặc này tạo thành cặp ngoặc
liên hợp. Số ký tự nằm giữa 2 ngoặc của một cặp ngoặc liên hợp được gọi là
khoảng cách của cặp ngoặc đó.
Cho số nguyên n và khoảng cách của các cặp ngoặc liên hợp trong biểu thức
ngoặc.
Nếu có thể xác định biểu thức ngoặc đúng có khoảng cách các cặp ngoặc liên hợp
thỏa mãn dữ liệu đã cho thì đưa ra thông báo Yes và ở dòng tiếp theo – một biểu
thức ngoặc đúng tùy chọn thỏa mãn điều kiện đã nêu.
Nếu không tồn tại biểu thức ngoặc đúng thỏa mãn điều kiện đã nêu – đưa ra
thông báo No.
Dữ liệu: Vào từ thiết bị vào input chuẩn của hệ thống:
Dòng đầu tiên chứa một số nguyên n (1 ≤ n ≤ 20),
Dòng tứ 2 chứa n số nguyên a1, a2, . . ., an – khoảng cách của các cặp
ngoặc liên hợp (0 ≤ ai ≤ 2×n, i = 1 ÷ n).
Kết quả: Đưa ra thiết bị ra chuẩn của hệ thống các thông tin xác định được theo
quy cách đã nêu.
Cho tam giác ABC với đỉnh là các điểm có tọa độ nguyên (xa, ya), (xb, yb) và
(xc, yc). Hãy tính và đưa ra diện tích của tam giác đã cho.
Dữ liệu: vào từ file INPUT.TXT gồm 3 dòng, mỗi dòng chứa 2 số nguyên xác
định tọa độ của một đỉnh. Các số trên một dòng ghi cách nhau một dấu cách.
Kết quả: đưa ra file OUTPUT.TXT diện tích tính được.
Ví dụ:
INPUT.TXT OUTPUT.TXT
1 5 1000.0
31 45
61 5
Cho hình chữ nhật được xác định bởi tọa độ 2 đỉnh đối (xa, ya) và (xc, yc). Các
tọa độ có giá trị nguyên.
Hãy xác định bán kính đường tròn ngoại tiếp hình chữ nhật đã cho.
Dữ liệu: vào từ file INPUT.TXT, dòng thứ nhất chứa 2 số nguyên xa, ya, dòng
thứ hai chứa 2 số nguyên xc, yc. Các số trên một dòng ghi cách nhau một dấu
cách.
Kết quả: đưa ra file OUTPUT.TXT độ dài bán kính xác định được.
Ví dụ:
INPUT OUTPUT
0 30 25.0
40 0
Cho n đoạn thẳng trên đường thẳng, đoạn thứ i có tọa độ các điểm đầu và cuối
là ai, bi. Hãy tính độ dài của hợp các đoạn đã cho.
Dữ liệu: Vào từ file văn bản INPUT.TXT:
Dòng đầu tiên chứa một số nguyên n (1 ≤ n ≤ 105),
Dòng thứ i trong n dòng sau chứa 2 số nguyên ai và bi (-109 ≤ ai ≤ bi ≤
109).
Kết quả: Đưa ra file văn bản OUTPUT.TXT một số nguyên – độ dài tính được.
INPUT.TXT OUTPUT.TXT
4 17
1 5
3 8
14 16
10 20
Xét đa giác n đỉnh diện tích khác 0, cạnh không tự cắt và trong mặt phẳng với hệ
tọa độ Đề các tọa độ các đỉnh đa giác đều nguyên, đỉnh thứ i có tọa độ (xi, yi),
i = 1 ÷ n.
Hãy xác định k và m, trong đó k là số lượng điểm có tọa độ nguyên nằm trên cạnh
của đa giác (có thể là đỉnh) và m – số lượng điểm có tọa độ nguyên nằm trong đa
giác.
Dữ liệu vào từ file văn bản INPUT.TXT, dòng đầu tiên chứa số nguyên n, dòng
thứ i chứa 2 số nguyên xi, yi ghi cách nhau một dấu cách, xác định tọa độ đỉnh
i của đa giác. Các đỉnh được liệt kê theo một chiều nào đó.
Kết quá đưa ra file văn bản OUTPUT.TXT trên một dòng 2 số nguyên k và m,
các số ghi cách nhau một dấu cách.
Ví dụ:
INPUT.INP OUTPUT.OUT
6 12 15
2 1
0 3
3 6
6 5
8 1
4 3
Kết quả: Đưa ra file văn bản OUTPUT.TXT một số nguyên – số điểm ít nhất cần
chọn.
Ví dụ:
INPUT.TXT OUTPUT.TXT
7 4
1 5
3 8
30 32
25 35
33 33
10 20
14 16
Đây là mô hình toán học của một dạng bài toán lập lịch.
Để tạo không khí học tập sôi động, thầy giáo yêu cầu mỗi người trong lớp viết
một biểu thức số học trong Python với các toán hạng là các hằng, các biến nguyên
a, b, c. Biểu thức có thể chứa các cặp ngoặc tròn (, ).
Khi chấm, một bộ 3 giá trị các biến sẽ được tạo ngẫu nhiên trong phạm vi [-10,
10] với a, [-5, 5] với b và [0, 10] với c và được dùng để tính cho mọi
biểu thức đã nộp và từ đó – tính trung bình các giá trị nhận được.
Ai có biểu thức với giá trị không lệch quá giá trị trung bình 20% sẽ được miễn
kiểm tra một tiết sắp tới.
INPUT.TXT
6
a**2 + b**2 + c*c
(a+b)*(a+c)- a*b*c
(a+b+c)/(a*a+b*b+c*c+1)
15*a - int(4/b) +6*c
a*b + a*c + b*c
a/(b*b+c*c+1) + b/(a*a+c*c+1) + c/(b*b+a*a+1)
OUTPUT.TXT
a,b,c: -1 3 6
Average: 17.295479
Total results in range: 1
Winners: 4
INPUT.TXT OUTPUT.TXT
6 1 3 4 2 5 6
3 4 1
5 1 6
5 4 2
2 4 3
2 5 6
6 1 3
Để theo dõi tình hình thời tiết ngoài khơi người thả n phao nổi chứa các thiết bị
đo đạc. Ban đầu các phao này được thả và neo dọc theo một đường thẳng.
Sau một thời gian, dưới tác động của gió và sóng, một số neo có thể bị chuyển
dịch làm cho các phao có khả năng không còn nằm trên một đường thẳng nữa.
Số liệu tự động gửi về cho thấy phao thứ i đang ở tọa độ (xi, yi), i = 1 ÷ n.
Bob được lớp cử đi mua hoa tặng Alice nhân ngày sinh nhật.
Quầy bán hoa trưng bày n loại hoa. Tại quầy loại thứ i có ai bông, i = 1 ÷ n.
Bob biết Alice thích số lẻ hơn số chẵn vì vậy quyết định mua một bó hoa gồm số
lẻ loại hoa và mỗi loại – có số lẻ bông.
Hãy xác định bó hoa Bob sẽ có số lượng tối đa bao nhiêu bông.
Dữ liệu: Vào từ file INPUT.TXT:
Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 105),
Dòng thứ 2 chứa n số nguyên a1, a2, . . ., an (1 ≤ ai ≤ 103, i = 1 ÷ n).
Kết quả: Đưa ra file văn bản OUTPUT.TXT một số nguyên – số lượng tối đa các
bông hoa được mua.
Ví dụ:
Các số nguyên không âm theo cơ số B (B >1) tạo thành một nhóm có các tính
chất tương tự nhau không phụ thuộc vào cơ số B. Vì vậy, nếu một vấn đề đã giải
quyết được với cơ số B1 thì cũng có thể dễ dàng giả quyết ở cơ số B2. Việc bảo
toàn các tính chất đó được gọi là bất biến đại số.
Trong Tin học tính bất biến hỗ trợ rất nhiều trong việc xác định giải thuật. Một
bài toán đã giải quyết được ở cơ số 3 thì có thể dễ dàng triển khai để giải với cơ
số B > 1 bất kỳ.
Để chứng minh cho điều đó bài tập về nhà cho cả lớp là
cho 2 số nguyên dương x và y ở cơ số B, x ≤ y và mỗi
số có không quá 5×105 chữ số. Yêu cầu thực hiện các
phép biến đổi:
1. Tính tích các số nguyên từ a đến b, kể cả a và b,
2. Tính tổng các chữ số trong kết quả nhận được,
3. Nếu tổng không nhỏ hơn B thì thực hiện lại bước
2, trong trường hợp ngược lại – đưa ra chữ số
nhận được.
Hãy xác định chữ số cần đưa ra.
Mỗi người trong lớp nhận được một cơ số B khác nhau
và 2 số x, y ở cơ số tương ứng.
Alice nhận được cơ số B là 16 – cơ số Hexa. Các chữ
số của cơ số Hexa được nêu ở bảng bên.
Hãy xác định chữ số Alice cần đưa ra. Nếu chữ số nhận
được lớn hơn 9 thì đưa ra dưới dạng chữ cái hoa.
Dữ liệu: Vào từ file INPUT.TXT, dòng thứ nhất chứa số nguyên x, dòng thứ 2
chứa số nguyên y (x ≤ y), mỗi số có không quá 5×105 chữ số, trong một số các
chữ số lớn hơn 9 có thể ghi dưới dạng cả ký tự hoa lẫn ký tự hoa thường, ví dụ
1bA hoặc 1BA hay 1Ba.
Bob làm nhiệm vụ lên kế hoạch giao hàng ở một công ty bán hàng qua mạng.
Việc lên kế hoạch sẽ dễ dàng hơn nhiều nếu tìm thấy một kế hoạch như thế trước
đó.
Hôm nay cần chuyển n gói hàng cho khách. Bob xếp các gói hàng thành một dãy
dài và ghi trên nhãn mỗi gói một chữ cái từ a đến z tùy thuộc vào tính chất của
hàng, từ đó nhận được xâu đặc trưng s độ dài n. Với trí nhớ tốt, Bob có cảm giác
đã có một kế hoạch tương tự như vậy với xâu đặc trưng t cũng có độ dài n. Nếu
quả thật như thế thì từ s có thể nhận được t bằng cách thực hiện một lần hai phép
biến đổi sau:
Mang k gói hàng ở đầu dãy đặt xuống cuối dãy (0 ≤ k < n), giữ nguyên
trình tự trong các gói hàng mang xuống cuối,
Áp dụng cách mã hóa Ceasar với các ký tự ghi trên nhãn hàng, tức là thay
vòng tròn mỗi ký tự bằng ký tự đứng trước nó d vị trí (0 ≤ d <26), ví dụ,
với d = 4 thì e chuyển thành a, c chuyển thành y.
Thà mất công kiểm tra một chút còn hơn đi xây dựng kế hoạch mới, Bob quyết
định thực hiện biến đổi từ s sang t.
Hãy xác định từ s Bob có nhận được xâu t hay không và nếu được thì cần thực
hiện biến đổi với k nhỏ nhất và d là bao nhiêu.
Dữ liệu: Vào từ file INPUT.TXT:
Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 2×105),
Dòng thứ 2 chứa xâu s từ các ký tự la tinh thường độ dài n,
Dòng thứ 2 chứa xâu t từ các ký tự la tinh thường độ dài n.
Kết quả: Đưa ra file văn bản OUTPUT.TXT thông báo “Impossible” nếu
không thể đưa s về t theo cách đã nêu và thông báo “Succes” nếu biến đổi
được. Trong trường hợp biến đổi được – dòng thứ 2 đưa ra các giá trị k và d.
Procon là cuộc thi trang bị trí tuệ nhân tạo đơn giản cho robot. Với các nhiệm vụ
đặt ra các đội phải lập trình, trang bị cho robot để nó có thể thực hiện các nhiệm
vụ một cách độc lập, không có sự can thiệp tiếp theo của con người.
Một trong số các bài thi năm nay là lắp ráp số nguyên. Mỗi robot được giao n
khối lập phương. Trên mỗi mặt của khối lập phương có in một chữ số trong phạm
vi từ 0 đến 9. Như vậy mỗi khối lập phương chứa 6 chữ số. Các chữ số này có thể
giống nhau.
Robot phải lấy các khối lập phương, xoay và đặt cạnh nhau sao cho mặt trên của
chúng thể hiện một số nguyên không bắt đầu bằng chữ số 0. Các số cần tạo ra lần
lượt là 1, 2, 3, . . . Mỗi khối lập phương có thể tham gia vào việc tạo các số khác
nhau. Quá trình tạo số sẽ dừng lại khi gặp số nguyên đầu tiên không thể lắp ráp
từ các khối đã cho.
Hãy xác định số nguyên làm dừng quá trình tạo số.
Dữ liệu: Vào từ file INPUT.TXT:
Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 105),
Dòng thứ i trong n dòng chứa xâu 6 ký tự số trong tập các chữ số hệ 10
xác định các chữ số ghi trên khối lập phương thứ i.
Kết quả: Đưa ra file văn bản OUTPUT.TXT số nguyên tìm được.
Ví dụ:
INPUT.TXT OUTPUT.TXT
3 90
123456
789012
345678
Nhập số nguyên
f(ka-1) a b
ka-1 ka kb
f(kb)-f(ka-1)
Chương trình
a = int(input('Số lẻ thứ I : '))
b = int(input('Số lẻ thứ II: '))
p = a//2
q = (b+1)//2
print('Sum = ',q*q-p*p)
Độ phức tạp giải thuật: O(1)
r = int(v*t*m)
print('Khoảng cách: ',(r+p-1)//p,'tỷ km.')
Chương trình
x2 = int(input('x2 = '))
x3 = int(input('x3 = '))
b = -(x1+x2+x3)
c = x1*x2+x1*x3+x2*x3
d = -x1*x2*x3
print('b =',b,' c =',c,' d =',d)
Giải thuật:
Không phụ thuộc vào tính chẵn lẻ của n, cứ 2 hàng phải chặt đôi một viên.
Nếu m là lẻ thì n phải chẵn (từ điều kiện đầu bài), Để lát hàng cuối cùng: không
cần chặt gạch.
Chương trình
m = int(input('m = '))
n = int(input('n = '))
print('Result:',m*n//2,m//2)
p-1 p fq -fp
q
Công thức tính tổng các số nguyên từ 1 đến k:
𝑘 × (𝑘 + 1)
2
Chương trình
s = input('s = ').split()
p, q = [int(s[0]), int(s[1])]
fq = q*(q+1)//2
fp = p*(p-1)//2
r = fq - fp
print('Last digit:',r%10)
I.20_S – Hamburger
Chương trình
s = input('s = ').split()
a,b,n = [int(s[0]),int(s[1]),int(s[2])]
x = a*n + b*n//100
y = b*n%100
print('Result: ',x,'.',y,'usd')
I.21_S – Tôm sú
Chương trình
n = int(input('n = '))
r = n%100
print('Result:',r//10,r%10)
I.24_S – Số chữ số
Chương trình
import sys, time
fi = open("input.txt")
Thay thế bàn phím và
fo = open("output.txt","w")
màn hình bằng files
sys.stdin = fi
sys.stdout = fo
tb = time.time()
a = int(input())
b = int(input()) Đưa ra thời
Chương trình
c = str(abs(a+b)) gian thực hiện
xử lý
chương trình
print(len(c))
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Python cho phép thực hiện các phép tính số học với số nguyên có số lượng chữ
số bất kỳ. Với sự hỗ trợ của hàm factorial trong thư viện math ta có thể xác định
được giá trị các giai thừa cần thiết và từ đó – dẫn xuất trực tiếp giá trị cần tính.
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
from math import factorial
s = input().split()
m,n = int(s[0]), int(s[1])
res = factorial(n)//factorial(m)//factorial(n-m)
print(res)
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
Trường hợp cho 3 số nguyên, mỗi số trên một dòng:
a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
maxnum = a
if b > maxnum: maxnum = b
if c > maxnum: maxnum = c
print('Max =',maxnum)
Trường hợp cho 3 số nguyên trên cùng một dòng: Một cách nhập 3 số
s = input('s =').split() nguyên trên một dòng
a,b,c = int(s[0]),int(s[1]),int(s[2])
maxnum = a
if b > maxnum: maxnum = b
if c > maxnum: maxnum = c
print('Max =',maxnum)
Chương trình 2
Sử dụng cấu trúc if . . . else . . .
a = int(input('a = '))
b = int(input('b = '))
s = a + b
if s > 0: print ('Positive')
else:
if a+b < 0: print('Negative')
II.03_S – Bàn cờ
Giải thuật: m = 4, n = 6 (6, 4)
4
Xét ô trắng có tọa độ (i, j). 3 Ô trắng
i và j phải cùng chẵn hay cùng lẻ, 2
(5, 3)
điều này tương đương với điều kiện 1
i%2+j%2 là số chẵn. 1 2 3 4 5 6
Chương trình:
board = input('Size: ').split()
m, n = int(board[0]),int(board[1])
cell = input('Cell: ').split()
p, q = int(cell[0]),int(cell[1])
if (p % 2 + q % 2) % 2 == 0: print('W')
else: print('B')
qi = j – qj,
Ở trên đường chéo phụ đi qua ô (qi, qj): i – qi = qj – j.
Dùng một biến lô gic để tổng hợp kết quả kiểm tra 4 điều kiện trên.
Chương trình:
sq = input('sq = ').split()
qi,qj = int(sq[0]), int(sq[1]) Một cách nhập 2 số
sa = input('sa = ').split() nguyên trên một dòng
ai,aj = int(sa[0]), int(sa[1])
flag = (ai == qi) | (aj == qj)
flag |= (ai-qi == aj-qj) | (ai-qi+aj-qj == 0)
if flag: print('YES')
else: print('NO')
Chương trình:
sz = input('sz = ').split()
m, n = [int(sz[0]), int(sz[1])]
k = int(input('k = '))
if (k%m == 0) | (k%n == 0): print('YES')
else: print('NO')
II.09_S – Bể bơi
Giải thuật:
Chuẩn hóa dữ liệu để n là cạnh dài của bể bơi,
Từ x tìm khoảng cách gần nhất tới cạnh dài của bể bơi,
Từ y tìm khoảng cách gần nhất tới cạnh ngắn của bể bơi,
n
y
m
x
Chương trình:
sz = input('sz = ').split()
m, n = int(sz[0]), int(sz[1])
II.13_S – Ốc sên
Chương trình:
s = input('h,a,b: ').split()
h,a,b = int(s[0]),int(s[1]),int(s[2])
if h <= a: res =1
else: res = (h-b-1)//(a-b)+1
print('Result:',res)
II.15_S – Cấp số
Giải thuật:
Ba số a, b, c tạo thành cấp số cộng khi và chỉ khi
b – a = c - b
s = input().split()
a,b,c = int(s[0]),int(s[1]),int(s[2])
if b-a == c-b: Đưa ra thời gian thực hiện
d = c-b chương trình
print('AP',b+d, b+2*d)
elif b/a == c/b:
q = c/b
print('GM',c*q,c*q*q)
else: print('NP')
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
print('Sum =',sum)
Dễ dàng tính:
fb = 13 +23 + . . . + (a-1)3 + a3 + . . . + b3
fa = 13 +23 + . . . + (a-1)3
Kết quả cần tìm là fb – fa.
Chương trình:
a = int(input('a = '))
b = int(input('b = '))
fb = b * (b+1) // 2
fa = a * (a-1) // 2
print('Result =',fb*fb-fa*fa)
Chương trình:
n = int(input('n = '))
ft = 1
for i in range(2,n+1):
ft *= i
print('Result:',ft)
print('Result:',sum)
III.08_S – Số bị thiếu
Nếu đầy đủ các số từ 1 đến n thì tổng của chúng bằng n×(n+1)/2.
Từ tổng các số có mặt (được nhập vào) ta dễ dàng xác định được số bị thiếu.
Chương trình:
n = int(input('n = '))
x = n*(n+1)//2
for i in range(n-1):
x -= int(input())
print('Số bị thiếu:',x)
Chương trình:
a = int(input('a = '))
b = int(input('b = '))
for i in range(a, b+1):
print(i*i, end=' ')
Chương trình:
n = int(input('n = '))
for i in range(2,n+1):
if n % i == 0:
print(i)
break
Tìm vị trí bit 1 trái nhất trong dạng biểu diễn nhị phân của n.
Chương trình:
n = int(input('n = '))
m = n
k = -1
while m > 0:
k +=1
m >>=1
print(k, 1<<k)
Chương trình:
x = float(input())
y = float(input())
k = 0
while x < y:
k +=1
x *=1.1
print(k)
Chương trình:
size = 0
while int(input())> 0: size +=1
print(size)
Chương trình:
sum = 0
e = int(input())
while e != 0:
sum += e
e =int(input())
print('sum =',sum)
print('Average = ',sum/size)
print('Max = ',Max_e)
Chương trình:
even =0
print('Even:',even)
Chương trình:
prev = int(input())
res = 0
while prev != 0:
next = int(input())
if next != 0 and prev < next: res += 1
prev = next
print('Result =', res)
Giải thuật:
Tìm giá trị max thứ 2.
Tạo phòng đệm chứa số lớn nhất và lớn thứ nhì.
Nếu số mới lớn hơn số thứ 2:
Thay thế số tứ 2 bằng số mới,
Cập nhật vị trí các phần tử trong phòng đệm.
Chương trình:
n = int(input())
gold = int(input())
silver = int(input())
if gold < silver: gold, silver = silver, gold
for i in range(2, n):
eval = int(input())
if eval > silver:
silver = eval
if gold < silver: gold, silver = silver, gold
print('Silver:',silver)
print('Summary:',m)
Ghi chú: Có thể viết chương trình ngắn gọn hơn bằng các hàm max và count,
nhưng sẽ tốn thời gian thực hiện hơn.
print(ans)
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Bắt buộc có
III.24_S – Số nguyên tố
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo Khởi tạo mảng n+1 phần tử
tb = time.time() và gán giá trị đầu bằng 1
n = int(input()) 0 và 1 – không
a =[1]*(n+1) nguyên tố
a[0],a[1]=0,0
Loại bỏ các số
d , p = 2, 2
chia hết d
res = 1
while p < n:
for i in range(p,n+1,d):a[i]=0
d =n+1
for i in range(p,n+1):
if a[i]> 0: Tìm d mới
d = i
break
p = d
if p<=n: res += 1
Xử lý kết thúc
print(res)
n = int(input())
c_old = 1
for i in range(1,n):
c_new = 2*(2*i+1)*c_old//(i+2)
c_old = c_new
print(c_new)
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
n = int(input())
t = factorial(n)
res = factorial(2*n)//t//t//(n+1)
print(res)
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
IV.02_S – Số lượng từ
Chương trình:
print(input().count(' ')+1)
IV.04_S – Vị trí ký tự
Chương trình:
s = input()
c = input()
if s.count(c) == 1:print(s.find(c))
elif s.count(c) > 1:
print(s.find(c),s.rfind(c))
else: print('-1')
IV.09_S – Xóa ký tự
Chương trình:
c = input()
w = s.replace(c,'')
print(w)
print(r)
t = input()
w_old = input()
w_new = input()
lwo = len(w_old)
p = t.find(w_old)
while p >= 0:
t = t[:p] + w_new + t[p+lwo:]
print(t)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
a = round(random()*1000000, 6)
b = round(random()*1000000, 6)
c = a*b
print('a,b,c:',a,b,c) Đổi số thành xâu
strnum = str(c)
maxdg = 0
for i in strnum:
if i == '.': continue Duyệt tìm chữ số
elif maxdg < int(i): lớn nhất
maxdg = int(i)
print('Maxdigit:',maxdg)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time() Danh sách từ
lx = 0
sx =''
for s in input().split():
if len(s) >lx: lx, sx = len(s), s
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
n = int(input())
b = int(input())
pat ='0123456789ABCDEF'
x = ''
while n > 0: Giải thuật đổi cơ số
i = n % b
x += pat[i]
n //=b
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
x = input()
y = x[::-1] Xâu đảo ngược
t = int(x)+int(y)
z = str(t)
while z != z[::-1]:
z = z[::-1]
t = t + int(z)
z = str(t)
print(z)
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, string
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
s = input()
t = s[-1]
t = t.upper()
res = float(s[0:-1])
if t == 'C':
res = res*1.8+32
fo.close()
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
Phần chương trình xử lý:
sys.stdout = fo Không thay đổi
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
fo.close()
Phải có
V.01_S – Vị trí lẻ
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo Bước thay đổi
tham số
s = input().split()
for i in range(1, len(s),2):
print(s[i],end=' ')
for i in range(len(s)):
if a[i]&1 == 0: print(a[i],end=' ')
fo.close()
fo.close()
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo Lưu ý các biên
fo.close()
print(mx, idx)
Bắt đầu từ 1
fo.close()
fo.close()
Giải thuật II: Tìm kiếm nhị phân. Độ phức tạp phần xử lý tìm vị trí: O(logn).
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
p = r
print(p)
fo.close()
Giải thuật III: Sử dụng công cụ tìm kiếm nhị phân của hệ thống. Độ phức tạp
phần xử lý tìm vị trí: O(logn).
Python 3.0 trở lên cung cấp thư viện bisect chứa các hàm phục vụ tìm kiếm
nhị phân trên danh sách đã sắp xếp tăng dần (không giảm), trong đó có hàm
bisect_left(a,x) tìm vị trí p lớn nhất thỏa mãn các điều kiện:
ai ≤ x với mọi i ≤ p,
aj > x với mọi j > p.
Hàm bisect_left còn cho phép tìm trong khoảng cho trước trong a.
Để sử dụng bisect_left cần:
Nạp mô đun bisect_left từ thư viện bisect,
Đảo ngược dãy a để có dãy không giảm.
Vị trí cần tìm sẽ được tính từ vị trí do hàm tìm kiếm cung cấp.
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w") Kết nạp hàm vào
sys.stdin = fi chương trình
sys.stdout = fo
from bisect import bisect_left
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
fo.close()
for i in range(0,len(a)-1,2):
a[i], a[i+1] = a[i+1], a[i]
fo.close()
fo.close()
a.pop()
print(' '.join([str(i) for i in a]))
fo.close()
fo.close()
V.13_S – Cặp phần tử trùng nhau
Giải thuật I: Tìm kiếm trực tiếp, độ phức tạp O(n2).
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
print(cnt)
fo.close()
Giải thuật II: Sử dụng tập hợp để lọc dữ liệu, độ phức tạp O(nlog n).
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
print(res)
fo.close()
V.14_S – Độ đa dạng
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
fo.close()
fo.close()
V.16_S – Bowling
Chương trình:
fo.close()
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
from random import randint
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
n = int(input())
a,b = [int(i) for i in input().split()]
print('a,b:',a,b)
lst = [0]*n
for i in range(n):
lst[i]=randint(a,b)
odd_neg,ev_neg,odd_pos,ev_pos = 0,0,0,0
for i in lst:
if i < 0:
if (i&1) == 0: ev_neg +=1
else: odd_neg += 1
if i > 0:
if (i&1) == 0: ev_pos +=1
else: odd_pos += 1
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
n = int(input())
# Tạo danh sách rỗng chứa kết quả nhập
A = []
t = n
# Nhập từng phần của A và kết nối vào cuối kết quả đã có
while t > 0:
c = [int(i) for i in input().split()]
p = len(c)
A += c
t -= p
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Nhận xét:
Độ phức tạp giải thuật: O(n),
Có thể viết chương trình gọn hơn dựa trên cơ sở Stable Sort, nhưng độ phức
tạp của giải thuật sẽ là O(n2).
Giải thuật:
Với mỗi i (i = 0, 1, 2, . . ., n-2) cần tính
sumi = ∑𝑛−1
𝑗=𝑖+1 |𝑏𝑖 − 𝑏𝑗 |
Để tránh phải làm việc với giá trị tuyệt đối: sắp xếp b theo thứ tự tăng dần.
Khi đó tổng sumi cần tính có dạng:
sumi = ∑𝑛−1
𝑗=𝑖+1(𝑏𝑗 − 𝑏𝑖 )
sumi = ∑𝑛−1
𝑗=𝑖+1 𝑏𝑗 − (𝑛 − 𝑖 − 1) × 𝑏𝑖 )
sumi = ∑𝑛−1
𝑗=𝑖 𝑏𝑗 − (𝑛 − 𝑖) × 𝑏𝑖 )
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
Giải thuật:
Cấu trúc dữ liệu dict thích hợp với phần lớn các bài toán liên quan tới tần số.
Tuy vậy, ở đây ta sẽ vòng tránh việc sử dụng cấu trúc dict.
n = int(input())
a = []
for i in range(n):
a.append(input())
Sử dụng công cụ lọc loại bỏ phần tử lặp có thể dễ dàng tìm tần suất xuất hiện lớn
nhất của các phần tử khác nhau:
fr = 0;
for x in set(a):
t = a.count(x)
if t > fr: fr = t;
Vấn đề còn lại chỉ là tìm tất cả các phần tử có cùng tần suất lớn nhất đã xác định:
b = []
for x in set(a):
if a.count(x) == fr:
b.append(x)
Các kết quả cần đưa ra có thể dễ dàng dẫn xuất từ danh sách b:
print(fr, len(b))
for x in b:
print(x,end=' ')
Nhận xét:
Chương trình ngắn gọn và đơn giản nhưng độ phức tạp có thể cao, bậc
O(n2) vì hàm count có thể có độ phức tạp O(n),
Việc sử dụng cấu trúc dữ liệu dict sẽ cho chương trình hiệu quả hơn.
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
n = int(input())
a = []
for i in range(n):
a.append(input())
fr = 0;
for x in set(a):
t = a.count(x)
if t > fr: fr = t;
b = []
for x in set(a):
if a.count(x) == fr:
b.append(x)
print(fr, len(b))
for x in b:
print(x,end=' ')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
print("{:.6f}".format(res))
fo.close()
def fpower(a,n,p):
r, t = 1, a
while n > 0:
if (n&1) > 0: r = r*t%p
t = t*t%p
n >>= 1
fo.close()
def fmult(x,y,p):
r, t = 0, x
while y > 0:
if (y&1) > 0: r = (r+t)%p
t = (t<<1)%p
y >>= 1
return r
fo.close()
Chương trình:
import sys, time
from random import randint
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
def lower_bound(a,val):
la = len(a);
lf, rt = -1, la
while rt-lf>1:
mid = (lf+rt)//2
if a[mid]<=val: lf=mid
def upper_bound(a,val):
la = len(a);
lf, rt = -1, la
while rt-lf>1:
mid = (rt+lf)//2
if a[mid]<= val: lf=mid
else: rt=mid
return rt
n = int(input())
b = [int(i) for i in input().split()]
v = int(input())
p = lower_bound(b,v)
print("Lower bound:",p+1,b[p])
q = upper_bound(b,v)
print('Upper bound:',q+1,b[q])
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
fi = open("input.txt")
fo = open("output.txt","w") Tính giá trị đa thức
sys.stdin = fi
theo sơ đồ Horner
sys.stdout = fo
tb = time.time()
def polynomial(a,n,x):
p = 0.0
for i in range(n+1):
p = p*x + a[i]
return p
n = int(input())
a = [int(i) for i in input().split()]
x = float(input())
print(polynomial(a,n,x))
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
def check_same(z):
if len(z) != len(set(z)): return 0
else: return 1
n = int(input())
a, b = [int(i) for i in input().split()]
c =[0]*n
for i in range(n):
c[i] = randint(a,b)
if check_same(c) == 1: print('Yes')
else: print('No')
#print(c)
print("Time: {:.4f}".format(time.time()-tb))
fo.close(
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi Một cách nhập
sys.stdout = fo mảng 2 chiều
print(i_x, j_x)
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi Khởi tạo giá trị đầu
sys.stdout = fo mảng 2 chiều
n = int(input())
a = [['.']*n for i in range(n)]
for i in range(n):
a[i][i] = '*'
a[n//2][i] = '*'
a[i][n//2] = '*' Đưa ra từng dòng
a[i][n-i-1] = '*'
for row in a:
print(' '.join(row))
n = int(input())
a = [[abs(i - j) for j in range(n)] for i in range(n)]
for row in a:
print(' '.join([str(i) for i in row]))
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
n = int(input())
a = [[0] * n for i in range(n)]
for i in range(n):
a[i][n - i - 1] = 1
for i in range(n):
for j in range(n - i, n):
a[i][j] = 2 Cách khác đưa ra
for row in a: các số của một dòng
for e in row:
print(e, end=' ')
print()
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
Chương trình:
import sys, time
from random import randint
fi = open("input.txt")
fo = open("output.txt","w") Nạp mô đun tạo số
sys.stdin = fi nguyên ngẫu nhiên
sys.stdout = fo
tb = time.time()
for i in range(m):
for j in range(n):
for i in range(m):
for j in range(n):
if b[i][j] == k: print(i+1,j+1)
print("Time: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
for i in range(m):
r = [int(j) for j in input().split()]
a.append(r)
t = sum(r)
if mx_r < t: mx_r, i_x = t,i
mx_c = -1e9
for j in range(n):
t =0
for i in range(m): t+=a[i][j]
if mx_c < t : mx_c, j_x = t, j
res = mx_r+mx_c - a[i_x][j_x]
print(res)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
print(len(set(input().split())))
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
VIII.04_S – Số mới
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
fo.close()
def print_set(s):
print(len(s))
print(*[str(elem) for elem in sorted(s)])
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
n = int(input())
w = set()
for i in range(n):
w.update(input().split())
print(len(w))
fo.close()
VIII.07_S – Đoán số
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
n = int(input())
s_a = set(range(1,n+1))
s_p = s_a
while True:
guess = input()
if guess == 'Help': break
guess = {int(k) for k in guess.split()}
answer = input()
if answer == 'Yes':
s_p &= guess
else:
s_p &= s_a - guess
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
fo.close()
Chương trình:
import sys
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
fo.close()
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
res = 0
for i in a_set:
j = a.count(i)
if res < j: res, v = j, i
print(v,res)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
def sieve_1(n):
prime =[1]*(n+1)
prime[0], prime[1] = 0, 0
for i in range(n+1):
if prime[i] == 1:
if i*i <= n:
for j in range(i*i,n+1,i): prime[j] = 0
res = []
for i in range(n+1):
if prime[i] == 1:
res.append(i)
return res
n = int(input())
for i in range(n):
m = int(input())
ans = sieve_1(m)
print(m,len(ans))
for j in ans: print(j, end=' ')
print('\n')
print("\nTime: {:.4f}".format(time.time()-tb))
def sieve_2(n,m):
nprime = [False]*(m+1)
prime = []
nsqrt = int(sqrt(n))
for i in range(2,nsqrt+1):
if not nprime[i]:
prime.append(i)
if i*i <= nsqrt:
for j in range(i*i,nsqrt+1, i):
nprime[j] = True
res = 0
maxk = n//m
for k in range(maxk+1):
bl = [False]*(m+1)
start = k*m
cnt = len(prime)
for i in range(cnt):
start_idx = (start+prime[i]-1)//prime[i]
j = max(start_idx,2)*prime[i]-start
for l in range(j,m,prime[i]): bl[l] = True
if k == 0:
s = input().split()
n, m = int(s[0]), int(s[1])
print(n, sieve_2(n,m))
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật
Việc tính các hệ số này không phức tạp, chỉ cần dẫn xuất công thức biến đổi từ
cặp (a, b) sang (b%a, a).
Giả thiết ta đã biết nghiệm (x1, y1) đối với cặp (b%a, a):
(b%a)×x1 + a×y1 = g
Và muốn tìm cặp (x, y) đối với (a, b).
Ta có b%a = b – (a/b)×a.
Thế vào phương trình trên, có:
g = b%a)×x1 + a×y1
= (b-a/b)×x1 + a×y1
= b×x1 + a×(y1 – (a/b)×x1)
Từ đây suy ra:
x = y1 – (a/b)×x1,
y = x1.
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
def gcd_ex(a,b,res):
if a == 0:
res = [0, 1, b]
return res
res = gcd_ex(b%a,a,res)
t = res[1]
res[1] = res[0]
res[0] = t-(b//a)*res[0]
return res
s = input().split()
a, b = int(s[0]), int(s[1])
res = [0,0,0]
res = gcd_ex(a,b,res)
print(res[0],res[1],res[2])
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật
Dễ dàng thấy rằng số 0 không có nghịch đảo. Với m cho trước mỗi số nguyên
khác 0 có thể có hoặc không có nghịch đảo. Nghịch đảo chỉ tồn tại với các số
nguyên a nguyên tố cùng nhau với m.
Xét phương trình
a×x + m×y = 1
Đây là phương trình Diophantine tuyến tính bậc 2. Phương trình này có nghiệm
khi và chỉ khi gcd(a, m) = 1.
Lấy mô đun m cả 2 vế phương trình trên, ta có:
a×x = 1 (mod m)
Bằng giải thuật Euclid mở rộng dễ dàng tìm được x.
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
def gcd_ex(a,b,res):
if a == 0:
res = [0, 1, b]
return res
res = gcd_ex(b%a,a,res)
t = res[1]
res[1] = res[0]
res[0] = t-(b//a)*res[0]
return res
s = input().split()
a, m = int(s[0]), int(s[1])
res = [0,0,0]
ans = gcd_ex(a,m,res)
if ans[2] != 1: print('No Solution')
else:
res = (ans[0]%m+m)%m
print(res)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật
Theo các giải thuật đã nêu, bài toán có thể được giải quyết với độ phức tạp
O(mlogm).
Có một phương pháp tiếp cận khác cho phép giải với độ phức tạp O(m).
Ký hiệu r[i] là nghịch đảo của i theo mô đun m. Ta có:
r[1] = 1,
r[i] = -(m/i)×r[m%i]%m với i > 1.
Chứng minh:
m % i = m – (m/i)×i
Lấy mô đun m cả 2 vế, ta có
m % i = -(m/i)×i (mod m)
Nhân cả 2 vế với nghịch đảo của i và của (m%i) ta có
r[i] = -(m/i)×r[m%i] (mod m).
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
m = int(input())
r =[1]*m
for i in range(2,m):
r[i] = (m-(m//i)*r[m%i]%m)%m
for i in range(1,m): print(r[i],end = ' ')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật
Giải thuật cho bài toán trên có tên thường gọi là Meet-in-the-Midle (Gặp nhau ở
giữa) do Shanks đề xuất năm 1971. Bản thân Shanks gọi nó là “Giải thuật bước
nhỏ – bước lớn” (Baby-step-giant-step Algorithm).
Ta có phương trình cần giải
ax = b (mod m)
trong đó a và m nguyên tố cùng nhau.
Đặt x = n×p-q với n là một hằng nguyên dương chọn trước.
Khi đó phương trình cần giải có dạng:
an×p-q = b (mod m)
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
from math import sqrt
s = input().split()
flag = False
n = int(sqrt(m))
an = 1
ta = a%m
tn = n
while tn > 0:
if (tn & 1) > 0: an = (an*ta)%m
ta = (ta*ta)%m
tn >>=1
cur = an
vals = {}
for i in range(1,n+1):
if cur not in vals: vals[cur] = i
cur = (cur*an)%m
cur = b
for i in range(n+1):
if cur in vals:
ans = vals[cur]*n-i
if ans < m:
flag = True
break
cur = (cur*a)%m
if flag: print(ans)
else: print('-1')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật
Đầu tiên xét trường hợp a và b không âm.
Giải thuật Euclid mở rộng cho phép tính được g, xg và yg, trong đó g – ước số
chung lớn nhất của a, b và a×xg + b×yg = g.
Vế trái của phương trình ban đầu chia hết cho g, vì vậy vế phải, tức là c cũng
phải chia hết cho g và việc dẫn xuất tiếp theo dưới đây cho thấy bài toán có
nghiệm. Nếu c không chia hết cho g – bài toán vô nghiệm.
Chương trình
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
def gcd_ex(a,b,res):
if a == 0:
res = [0, 1, b]
return res
res = gcd_ex(b%a,a,res)
t = res[1]
res[1] = res[0]
res[0] = t-(b//a)*res[0]
return res
s = input().split()
a, b, c = int(s[0]),int(s[1]),int(s[2])
flag = True
res = [0,0,0]
ans = gcd_ex(abs(a),abs(b),res)
if c % ans[2] != 0:
print('-1')
else:
t = c//ans[2]
x0 = ans[0]*t
y0 = ans[1]*t
if a < 0: x0 = -x0
if b < 0: y0 = -y0
print(x0,y0)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Nếu một trong 2 hệ số a hoặc b bằng 0 phương trình đã cho sẽ có không quá một
nghiệm và do đó dưới đây ta sẽ không xét trường hợp này.
Đầu tiên ta tìm x nhỏ nhất nằm trong khoảng đã cho, tức là x ≥ minx. Gọi phần
tử đó là lx1. lx1 dễ dàng xác định được với chi phí O(1) theo công thức dẫn
xuất nghiệm đã nêu và ta có kl1 – hệ số k tương ứng với lx1.
Tương tự như vậy có thể tìm được x = rx1 ≤ maxx – x lớn nhất thuộc khoảng
đã cho và kr1 – hệ số k tương ứng với rx1.
Hoán đổi kl1 và kr1 nếu kl1 > kr1. Như vậy ta có đoạn [kl1, kr1] giá trị k
đảm bảo x nằm trong khoảng đã cho.
Bây giờ ta bắt đầu xét đến ràng buộc đối với y. Trước hết tìm y nhỏ nhất lớn hơn
hoặc bằng miny. Ký hiệu kl2 là k tương ứng với y tìm được. Tiếp sau – tìm y
lớn nhất thỏa mãn điều kiện y ≤ maxy và ký hiệu kr2 là k tương ứng với y tìm
được.
Hoán đổi kl2 và kr2 nếu kl2 > kr2. Như vậy ta có đoạn [kl2, kr2] giá trị k
đảm bảo y nằm trong khoảng đã cho.
Giao của 2 đoạn [kl1, kr1] và [kl2, kr2] là tập các giá trị k cho nghiệm trong
đoạn đã cho.
Nếu giao là rỗng – không có nghiệm nào thỏa mãn yêu cầu. Trường hợp giao
khác rỗng – ta có đoạn chung là [kl, kr]. Số lượng nghiệm thỏa mãn sẽ là kr-
kl+1.
Việc dẫn xuất nghiệm không phải là vấn đề lớn: lần lượt cho k nhận các giá trị
trong đoạn [kl, kr] và tính nghiệm theo công thức đã tìm được ở phần trước.
Giải thuật tìm giao của 2 đoạn thẳng:
kl = max(kl1,kl2);
kr = min(kr1,kr2);
if(kl>kr) /* vô nghiệm */; else /* xử lý trường hợp có
nghiệm*/;
Cho hai đoạn [minx, maxx] và [miny, maxy]. Cần xác định nghiệm nằm trong
đoạn đã cho có tổng x+y là nhỏ nhất.
Theo giải thuật ở phần trên ta có thể tìm đoạn [kl, kr] để dẫn xuất các nghiệm
nằm trong các đoạn đã cho.
Giả thiết (x, y) là một nghiệm của phương trình đang xét. Với một k cụ thể nào
đó ta có nghiệm mới (xn, yn):
xn = x + k×(b/g),
yn = y – k×(a/g).
Từ đây có:
xn + yn = x + y +k×(b – a)/g
Như vậy, để xn + yn là nhỏ nhất cần chọn k nhỏ nhất có thể khi b ≥ a và k lớn
nhất khi b < a.
def gcd_ex(a,b,res):
if a == 0:
res = [0, 1, b]
return res
res = gcd_ex(b%a,a,res)
t = res[1]
res[1] = res[0]
res[0] = t-(b//a)*res[0]
return res
def sol_segment():
global v1, v2, ans, kl, kr
g = ans[2]
get_segment(x0,minx,maxx,b//g)
klx, krx = v1, v2
get_segment(y0,miny,maxy,-a//g)
kly, kry = v1, v2
kl = max(klx, kly)
kr = min(krx, kry)
if kl > kr: print('-1')
else:
ta = b//g
tb = -a//g
print(kr-kl+1)
for i in range(kl,kr+1):
print(x0+i*ta,y0+i*tb)
return
def sol_min_sum():
global v1, v2, ans, kl, kr
g = ans[2]
ta = b//g
tb = -a//g
if a < b: k = kl
else: k = kr
print('Solution with min sum:',x0+k*ta,y0+k*tb)
return
s = input().split()
a, b, c = int(s[0]),int(s[1]),int(s[2])
s = input().split()
v1, v2 = 0, 0
minx,maxx,miny,maxy = int(s[0]),int(s[1]),int(s[2]),int(s[3])
res = [0,0,0]
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Đầu tiên xét trường hợp a và n nguyên tố cùng nhau. Khi đó có thể tìm phần tử
a-1 nghịch đảo với a theo mô đun n. Nhân cả 2 vế phương trình với phần tử
nghịch đảo này, ta nhận được nghiệm của phương trình và là nghiệm duy nhất:
x = b×a-1 (mod n)
Xét trường hợp a và n không nguyên tố cùng nhau. Phương trình đã cho có thể
vô nghiệm, ví dụ 2×x = 1 (mod 4).
Ký hiệu g = gcd(a,n). Vế trái của phương trình luôn luôn chia hết cho g, vì
vậy nếu b không chia hết cho g – bài toán vô nghiệm.
Chia a, b và n cho g, ta có phương trình
a’×x = b’ (mod n’)
a’ và n’ nguyên tố cùng nhau và theo cách đã xét, ta tìm được nghiện x’ duy
nhất. Dễ dàng thấy rằng nó cũng là nghiệm của phương trình ban đầu, nhưng
không phải là nghiệm duy nhất.
Trong đoạn cần xét, phương trình ban đầu có đúng g nghiệm và có dạng:
xi = x’ + i×n’, i = 0, 1, . . ., g-1
Như vậy, trong mọi trường hợp, phương trình ban đầu hoặc vô nghiệm hoặc có
đúng g = gcd(a,n) nghiệm trong đoạn [0, n-1].
def gcd_ex(a,b,res):
if a == 0:
res = [0, 1, b]
return res
res = gcd_ex(b%a,a,res)s
t = res[1]
res[1] = res[0]
res[0] = t-(b//a)*res[0]
return res
s = input().split()
a, b, n = int(s[0]), int(s[1]), int(s[2])
res = [0,0,0]
g = gcd(a,n)
if b%g != 0:
print('0')
else:
a //=g
b //=g
n //= g
ans = gcd_ex(a,n,res)
print(res)
x = (ans[0]%n+n)%n
x = (x*b)%n
print(g)
for i in range(g): print(x+i*n, end = ' ')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
def fac_pow(n,k):
res = 0
while n > 0:
n //=k
res +=n
return res
s = input().split()
n, k = int(s[0]), int(s[1])
ans = fac_pow(n, k)
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Phân tích k ra thừa số nguyên tố. Giả thiết ki là thừa số thứ i với số mũ pi. Áp
dụng giải thuật đã xét với ki ta có số mũ là ansi với độ phức tạp tính toán
O(logn).
Số mũ cần tìm sẽ là min{ansi/pi} với mọi i.
Tồn tại các phương pháp phân tích nhanh ra thừa số nguyên tố (sẽ xét sau). Ở đây
ta xét phương pháp đơn giản trong lập trình và có độ phức tạp O(√𝑘).
Giải thuật:
Nhận xét:
Do có yêu cầu đưa ra số lượng số nguyên tố khác nhau trong phép phân rã
k ra tích các thừa số nguyên tố nên cần lưu trữ các giá trị ai, bi nhận được
trong quá trình phân tích,
def calc_p(x):
global a, b, m
m, t = 0, 2
while t*t <= x:
if x%t == 0:
tg = 0
while x%t == 0:
x //= t
tg += 1
a.append(x)
b.append(tg)
m += 1
t += 1
if x > 1:
s = input().split()
n, k = int(s[0]), int(s[1])
a = []
b = []
ans = int(1e20)
calc_p(k)
for i in range(m):
calc_x(a[i])
if ans > res//b[i]: ans = res//b[i]
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
s = input().split()
n, p = int(s[0]), int(s[1])
ans = facmod(n,p)
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
def f_phi(n):
res = n
i = 2
while i*i <= n:
if n%i == 0:
while n%i == 0: n //= i
res -= res//i
i += 1
if n > 1: res -= res//n
return res
def generator(p):
phi = f_phi(p)
m = phi
fact = []
i = 2
while i*i <= m:
if m % i == 0:
fact.append(i)
while m%i == 0: m //= i
i += 1
if m > 1: fact.append(m)
for r in range(2,p+1):
ok = True
if gcd(r,p) != 1: continue
i = 0
while (i < len(fact)) and ok:
ok &= binpow(r,phi//fact[i],p) != 1
i += 1
if ok: return r
return -1
n = int(input())
ans = generator(n)
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
def generator(p):
phi = p-1
m = phi
fact = []
i = 2
while i*i <= m:
if m % i == 0:
fact.append(i)
while m%i == 0: m //= i
i += 1
if m > 1: fact.append(m)
for r in range(2,p+1):
ok = True
if gcd(r,p) != 1: continue
i = 0
while (i < len(fact)) and ok:
ok &= binpow(r,phi//fact[i],p) != 1
i += 1
if ok: return r
return -1
if any_ans == -1:
print('-1')
fo.close()
quit()
delta = (n-1)//gcd(k,n-1)
ans = []
for cur in range(any_ans%delta,n-1,delta):
ans.append(binpow(g,cur,n))
ans.sort()
print(len(ans))
for i in ans: print(i,end = ' ')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
def Leman(n):
sqrt3_n_up = ceil(pow(n,1.0/3))+2
m = 2
divisors = []
while (m*m <= n) and (m < sqrt3_n_up):
while n%m == 0:
divisors.append(m)
n //= m
m += 1
if m*m > n:
if n != 1: divisors.append(n)
return divisors
sqrt6_n = pow(n,1.0/6)
sqrt_n = sqrt(n)
for k in range(1,sqrt3_n_up):
sqrt_k = sqrt(float(k))
sqrt_4nk = ceil(2*sqrt_k*sqrt_n) + 2
diff = sqrt_4nk**2- 4*k*n
while diff >= 2*sqrt_4nk-1:
diff +=-2*sqrt_4nk+1
sqrt_4nk -= 1
max_d = ceil(sqrt6_n/(4*sqrt_k)) + 3
for d in range(max_d):
a = sqrt_4nk + d
b = round(sqrt(diff))
if b*b == diff:
d1 = gcd(a+b,n)
d2 = gcd(a-b,n)
if (1 < d1 < n) or (1 < d2 < n):
if 1 < d1 < n: p = d1
else: p = d2
divisors.append(p)
divisors.append(n//p)
return divisors
diff += 2*a+1
divisors.append(n)
return divisors
m = int(input())
s = input().split()
for i in range(m):
n = int(s[i])
res = Leman(n)
print(len(res))
for j in res: print(j,end = ' ')
print('\n',end ='')
Việc tính Fn và Fn+1 có thể dễ dàng thực hiện theo sơ đồ tính nhanh lũy thừa.
Xuất từ ma trận ban đầu
x = 1 1
1 0
Ta sẽ tính x2, x4, x8, . . . và tích lũy kết quả vào ma trận z kích thước 2×2
Để tăng tốc độ xử lý các ma trận x và z được lưu trữ dưới dạng một chiều:
x0 x1 z0 z1
x = x2 x3 z = z2 z3
import sys,time
fi=open("Input.txt")
fo=open("Output.txt","w")
sys.stdin=fi
sys.stdout=fo
tb=time.time()
def get_fib(k):
z = [1, 0, 0, 1]
x = [1, 1, 1, 0]
while k > 0:
if (k & 1) == 1: z = mul(x, z)
p = int(1e9)
for s in fi:
s = s.split()
a, b = int(s[0]), int(s[1])
if a == b:
if a == 0: ans = 1
else: ans = get_fib(a)
else:
ans = (get_fib(b+2) + p - get_fib(a+1))%p
print(ans)
import sys,time
fi=open("Input.txt")
fo=open("Output.txt","w")
sys.stdin=fi
sys.stdout=fo
tb=time.time()
def calc_sum(y):
global nb,b0,b_sum
r = 0
p = nb+1
b_sum = ''
b0 = [0]*21
for i in range(nb):
q = nb-i
if (y &(1<<i))> 0:
r += b[q]
b_sum +=sb[q]
b0[q] = 1
return r
def get_base(x):
global nb,flag,b,b0,b_sum,a
a[x+1] -= 1
for i in range(1, 1<<nb):
t = calc_sum(i)
flag = (t == x)
if flag: break
n = int(input())
a = [0]*22
b = [0]*22
sb = ['']*22
ans = ''
flag = False
t = [int(i) for i in input().split()]
for i in range(n):
k = (t[i]+2)//2
if ((t[i]&1) == 1) or (k > n):
print('No')
fo.close()
quit()
a[k] += 1
nb = a[1]
for i in range(1,nb+1):
b[i] = 1
sb[i] = '()'
for i in range(2,n+1):
if a[i] == 0: continue
while a[i] > 0:get_base(i-1)
if not flag:
print('No')
fo.close()
quit()
print('Yes')
if nb == 1: ans = sb[1]
else:
for i in range(1,nb+1): ans += sb[i]
print(ans)
Chương trình:
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
s = input().split()
xb, yb = int(s[0]), int(s[1])
s = input().split()
xc, yc = int(s[0]), int(s[1])
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
S = √𝒑 × (𝒑 − 𝒂) × (𝒑 − 𝒃) × (𝒑 − 𝒄)
Trong đó:
a, b, c – độ dài các cạnh tam giác,
p = (a+b+c)/2
s = input().split()
xb, yb = float(s[0]), int(s[1])
s = input().split()
xc, yc = float(s[0]), int(s[1])
a = sqrt((xb-xc)**2+(yb-yc)**2)
b = sqrt((xa-xc)**2+(ya-yc)**2)
c = sqrt((xb-xa)**2+(yb-ya)**2)
p = (a+b+c)/2
dt = sqrt(p*(p-a)*(p-b)*(p-c))
print("Area =",dt)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
s = input().split()
xb, yb = float(s[0]), int(s[1])
s = input().split()
xc, yc = float(s[0]), int(s[1])
a = sqrt((xb-xc)**2+(yb-yc)**2)
p = yc-yb
q = -(xc-xb)
r = yb*(xc-xb)- xb*(yc-yb)
h = (p*xa+q*ya+r)/sqrt(p*p+q*q)
dt = a*h/2
print("Area =",dt)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật
Đường tròn ngoại tiếp hình chữ nhật nhận đường chéo hình chữ nhật làm đường
kính. Vì vậy bán kính cần tìm bằng một nửa độ dài đường chéo hình chữ nhật.
s = input().split()
xc, yc = float(s[0]), int(s[1])
r = sqrt((xa-xc)**2+(ya-yc)**2)/2
print(r)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Tâm đường tròn ngoại tiếp ABC là giao của các đương trung trực.
Gọi M1 là điểm giữa của cạnh BC, M2 – điểm giữa cạnh AB, O – tâm đường tròn
ngoại tiếp tam giác.
A(xa,ya)
M2(xm2,ym2)
B(xb,yb)
M1(xm1,ym1) C(xc,yc)
a1×x + b1×y = c1
Lập luận tương tự với đường trung trực đi qua điểm M2, ta có:
a2×x + b2×y = c2
Tọa độ tâm đường tròn ngoại tiếp là nghiệm của hệ phương trình:
a1×x + b1×y = c1
a2×x + b2×y = c2
Ký hiệu
𝑎1 𝑏1
d = = a1×b2-a2×b1
𝑎2 𝑏2
𝑐1 𝑏1
dx = = c1×b2-c2×b1
𝑐2 𝑏2
𝑎1 𝑐1
dy = = a1×c2-a2×c1
𝑎2 𝑐2
Tọa độ tâm đường tròn sẽ là (dx/d, dy/d).
Biết tọa độ tâm dễ dàng tính được độ dài bán kính
s = input().split()
xb, yb = float(s[0]), int(s[1])
s = input().split()
xc, yc = float(s[0]), int(s[1])
xm1 = (xb+xc)/2
ym1 = (yb+yc)/2
xm2 = (xb+xa)/2
ym2 = (yb+ya)/2
c1 = ym1*(yb-ym1)+xm1*(xb-xm1)
c2 = ym2*(yb-ym2)+xm2*(xb-xm2)
a1 = xb-xm1
b1 = yb-ym1
a2 = xb-xm2
b2 = yb-ym2
d = a1*b2-a2*b1
xr = (c1*b2-b1*c2)/d
yr = (a1*c2-c1*a2)/d
r = sqrt((xa-xr)**2+(ya-yr)**2)
print("Center:",xr,yr)
print("Radius =",r)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Giải thuật giải bài toán đã nêu được Klee công bố năm 1977 với độ phức tạp
O(nlogn) và là giải thuật nhanh nhất hiện nay.
Lưu tất cả các tọa độ vào mảng x,
Với mỗi phần tử của x: đánh dấu là điểm đầu hay điểm cuối của đoạn thẳng,
Kết quả
n = int(input())
x = [[0,0]]*(2*n)
for i in range(n):
s =input().split()
a,b = int(s[0]),int(s[1])
x[2*i] = [a, 0]
x[2*i+1] = [b,1]
x.sort()
c, ans = 1, 0
for i in range(1,2*n):
if c > 0: ans += x[i][0]-x[i-1][0]
if x[i][1] > 0: c-= 1
else: c +=1
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Định này do nhà toán học Áo G. A. Pick phát biểu và chứng minh năm 1899.
Dựa vào định lý này, nếu biết B và I ta có thể tính diện tích đa giác mà không
cần quan tâm đến tọa độ cụ thể của các đỉnh.
Ví dụ, với đa giác của hình dưới đây ta có :
Lưu ý: Định lý Pick không áp dụng với trường hợp 3 hay nhiều chiều.
n = int(input())
x =[0]*(n+1)
y = [0]*(n+1)
for i in range(n):
s = input().split()
x[i], y[i] = int(s[0]), int(s[1])
x[n], y[n] = x[0], y[0]
s, b = 0, 0
for i in range(n):
s += x[i]*y[i+1] - x[i+1]*y[i]
u = abs(x[i]-x[i+1])
v = abs(y[i]-y[i+1])
if u == 0 or v == 0: b += u+v
else: b += gcd(u,v)
s = abs(s)
print(I, b)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Dữ liệu được lưu trữ vào vector x, mỗi tọa độ được lưu dưới dạng nhóm 3 số
(tọa độ, dấu hiệu cuối đoạn, số thứ tự của đoạn)
Dùng mảng flg[] để đánh dấu, flg[i] = true nếu đã có điểm đại diện và
bằng false trong trường hợp ngược lại,
Sắp xếp x theo thứ tự tăng dần,
Duyệt x từ đầu đến cuối:
Gặp điểm đầu: nạp số thứ tự vào vector v,
Gặp điểm cuối: kiểm tra flg tương ứng, nếu đoạn tương ứng chưa có đại
diện thì tăng số lượng đại diện lên 1, đánh dấu có đại diện cho tất cả các
đoạn có số thứ tự lưu trữ trong v và xóa v.
n = int(input())
x = [[0,False,0]]*(2*n)
flag = [False]*n
for i in range(n):
s = input().split()
a, b = int(s[0]), int(s[1])
for i in range(2*n):
if not x[i][1]:
v[pv] = x[i][2]
pv += 1
if x[i][1] and not flag[x[i][2]]:
for j in range(pv): flag[v[j]] = True
flag[x[i][2]] = True
ans += 1
pv = 0
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Gợi ý:
Việc tính biểu thức s được thực hiện bằng câu lệnh v = eval(s).
a = randint(-10, 10)
b = randint(-5, 5)
c = randint(0, 10)
n = int(input())
v =[0]*n Tính giá trị
sum = 0 biểu thức
res = []
for i in range(n):
v[i] = eval(input())
sum += v[i]
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
1 3 4 2 5 6 1 3 4 2 5 6 1 3 4 2 5 6
Xét một bộ 3 số trong dữ liệu vào.
Để tiện lưu trữ và tìm kiếm: Sắp xếp các số trong bộ 3 theo thứ tự tăng dần.
Gọi kết quả sắp xếp là (a, b, c).
Có 3 cách tách nhóm 3 này thành một một cặp 2 số và số tiếp theo:
((a,b),c)
((a,c),b)
((b,c),a)
Khi cố định một cặp 2 số thì số thứ 3 đứng kề sẽ trở nên tiền định, đồng thời cũng
xác định cặp số tiếp theo chứa số thứ 3.
Với mỗi cách tách đã nêu, tìm các số tiếp theo. Nếu kết quả tìm kiếm cho dãy n
số thì đó là nghiệm bài toán. Vấn đề còn lại chỉ là xoay dãy số, đưa 1 về vị trí
đầu.
Xử lý:
Lưu quan hệ cặp số và số thứ 3:
for i in range(n):
inp[i] = [int(j) for j in input().split()]
inp[i][0] -=1
inp[i][1] -=1
inp[i][2] -=1
Nạp vào từ điển
inp[i].sort()
Xác định số
for st in range(3):
đứng kề
cur = []
for i in range(3): Xác định các
cur.append(inp[0][(st+i)%3]) số tiếp theo
while len(cur)< n:
l = len(cur)-1
a = cur[l]
b = cur[l-1]
ok = False
for x in ds[(min(a,b), max(a,b))]:
if x != cur[l-2]:
Gặp lại số đã xét cur.append(x)
ok = True
break
if not ok: break
Tìm vị trí số 0
trong dãy
if len(cur) == n: Đưa số 0 về đầu
it = cur.index(0)
cur2 = cur[it:]+cur[:it]
for elem in cur2: print(elem+1, end = ' ')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
quit()
n = int(input())
if n <= 4:
for i in range(1,n+1): print(i,end = ' ')
fo.close()
inp = [[0,0,0]]*n
ds = {}
for i in range(n):
inp[i] = [int(j) for j in input().split()]
inp[i][0] -=1
inp[i][1] -=1
inp[i][2] -=1
inp[i].sort()
if (inp[i][0], inp[i][1]) in ds:
ds[(inp[i][0], inp[i][1])].append(inp[i][2])
else: ds[(inp[i][0], inp[i][1])] = [inp[i][2]]
for st in range(3):
cur = []
for i in range(3):
cur.append(inp[0][(st+i)%3])
while len(cur)< n:
l = len(cur)-1
a = cur[l]
b = cur[l-1]
ok = False
for x in ds[(min(a,b), max(a,b))]:
if x != cur[l-2]:
cur.append(x)
ok = True
break
if not ok: break
if len(cur) == n:
it = cur.index(0)
cur = cur[it:]+cur[:it]
for elem in cur: print(elem+1, end = ' ')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
Xác định phương trình đường thẳng f(x,y) = ax+by+c đi qua 2 điểm P1 và
P2, trong đó:
a = y2-y1
b = -(x2-x1)
c = y1(x2-x1)-x1(y2-y1)
Tính f(xi,yi), i = 3 ÷ n, nếu f(xi,yi) ≠ 0 → 3 điểm P1, P2 và Pi không
thẳng hàng.
n = int(input())
s = input().split()
xb, yb = int(s[0]), int(s[1])
area = xa*yb - xb*ya
for i in range(3,n+1):
s = input().split()
xc, yc = int(s[0]), int(s[1])
if area + xb*yc - xc*yb + xc*ya - xa*yc != 0:
ir = i
break
if ir > 0:
print('Yes\n1 2',ir)
else: print('No')
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
n = int(input())
ir = 0
s = input().split()
xa, ya = int(s[0]), int(s[1])
s = input().split()
xb, yb = int(s[0]), int(s[1])
a = yb-ya
b = xa-xb
c = ya*(xb-xa) - xa*(yb-ya)
for i in range(3,n+1):
s = input().split()
xc, yc = int(s[0]), int(s[1])
if a*xc + b*yc + c != 0:
ir = i
break
if ir > 0:
Cơ sở lập trình.
Số loại hoa sẽ mua là n nếu n lẻ và bằng n-1 trong trường hợp ngược lại,
Nếu n chẵn – không mua loại hoa có số lượng nhỏ nhất,
Với loại hoa i được mua: số lượng bông sẽ mua là ai nếu ai lẻ và là ai-1 trong
trường hợp ngược lại.
Độ phức tạp của giải thuật: O(n).
# WA 46 A17
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tb = time.time()
n = int(input())
a = [int(i) for i in input().split()]
ans ,fmn = 0, 1001
if(n&1) == 1:
for i in range(n): ans += a[i] - (1-(a[i]&1))
else:
for i in range(n): fmn = min(fmn,a[i])
for i in range(n):
ans += a[i] - (1-(a[i]&1))
fmn -=1 -(fmn&1)
ans -= fmn
print(ans)
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()
sa = input()
sb = input()
na = len(sa)
nb = len(sb)
ta, tb = 0, 0
pat='0123456789ABCDEF'
a = sa.upper()
b = sb.upper()
for c in a:
k = pat.find(c)
ta += k
ta %= 15
for c in b:
k = pat.find(c)
tb += k
tb %= 15
tg = 15 - ta Tính a+=tg
res_a = ''
for i in range(na-1,-1,-1):
k = pat.find(a[i])
t = k+tg
tg = t//16
res_a += pat[t%16]
Không quá
14 số
tg = 1
for i in range(ta,tb+1): tg *= i
ans = 0
while tg > 0:
ans += tg&15
tg >>= 4
ans %= 15
if ans == 0: ans = 15
print(pat[ans])
# WA 41 A17
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tbb = time.time()
sa = input()
sb = input()
na = len(sa)
nb = len(sb)
ta, tb = 0, 0
pat='0123456789ABCDEF'
a = sa.upper()
b = sb.upper()
for c in a:
k = pat.find(c)
ta += k
ta %= 15
for c in b:
k = pat.find(c)
tg = 15 - ta
res_a = ''
for i in range(na-1,-1,-1):
k = pat.find(a[i])
t = k+tg
tg = t//16
res_a += pat[t%16]
tg = 1
for i in range(ta,tb+1): tg *= i
ans = 0
while tg > 0:
ans += tg&15
tg >>= 4
ans %= 15
if ans == 0: ans = 15
print(pat[ans])
print("\nTime: {:.4f}".format(time.time()-tbb))
fo.close()
p=”abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx”
yz
# WA 42 A17
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tbb = time.time()
n = int(input())
s = input()
t = input()
s2 = s + s
d = -1
p='abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
for i in range(26):
k = s2.find(t)
if k >= 0:
d =i;
break
s3 = ''
for j in range(2*n):
s3 += p[ord[s2[j]]-72]
s2 = s3
if d < 0:
k = s2.find(t)
if k != -1: d = 25
if k > 0: k = n-k
print("\nTime: {:.4f}".format(time.time()-tbb))
fo.close()
for i in range(n):
k = int(input())
Ghi nhận chữ số
s = str(k)
cur = []
for c in s: cur.append(ord(c)-48)
k = min(cnt[0] + 1, min(cnt[1:]))
if cnt[0] == k-1:
ans = '1'+'0'*(k-1) Trường hợp a
else:
for i in range(1,10):
if cnt[i] == k:
c = chr(i+48)
if cubes[0] == cubes[i]: ans = c + '0'*k
else:ans = c*(k+1)
break
Trường hợp b
print(ans) Trường hợp c
# WA 45 A17
import sys, time
fi = open("input.txt")
fo = open("output.txt","w")
sys.stdin = fi
sys.stdout = fo
tbb = time.time()
for d in set(cur):
cnt[d] += 1
cubes[d].append(i)
k = min(cnt[0] + 1, min(cnt[1:]))
if cnt[0] == k-1:
ans = '1'+'0'*(k-1)
else:
for i in range(1,10):
if cnt[i] == k:
c = chr(i+48)
if cubes[0] == cubes[i]: ans = c + '0'*k
else:ans = c*(k+1)
break
print(ans)
print("\nTime: {:.4f}".format(time.time()-tbb))
fo.close()
Pm = m×m×m×(m-2) - (m-1)×(m-1)×(m-1)×(m-3)
Lần lượt trừ lf cho Pm, m = 3, 4, 5, . . .chừng nào lf còn lớn hơn Pm ta sẽ xác
định được số đại diện m của nhóm đầu tiên cần xử lý.
Tổ chức dữ liệu:
Mảng int x[4] – Lưu các giá trị a, b, c, n.
Xử lý:
m = 3
m4 = m*m*m*(m-2) - (m-1)*(m-1)*(m-1)*(m-3)
while k > m4:
k -= m4 Số phần tử trong nhóm
m += 1
Thu hẹp m4 = m*m*m*(m-2) - (m-1)*(m-1)*(m-1)*(m-3)
khoảng cách
m×m×(m-2)-(m-1)×(m-1)×(m-3)
a b c n
m×m×(m-2)-(m-1)×(m-1)×(m-3)
b = v = min(m,p/kb+1)
Phần tử đầu tiên của nhóm con (u, v, c, n) có thứ tự từ điển là q = p-(v-
1)×kb).
Kích thước kc của nhóm các phần tử có a = u và b = v sẽ là:
1 nếu u = m hoặc v = m ,
kc =
m-2 trong trường hợp ngược lại.
Lưu ý: Khi lập trình, giá trị lf sẽ được thu lùi dần về các mốc địa chỉ đã nêu ở
trên.
for i in range(n):
k = int(input())
Ghi nhận chữ số
s = str(k)
cur = []
for c in s: cur.append(ord(c)-48)
k = min(cnt[0] + 1, min(cnt[1:]))
if cnt[0] == k-1:
ans = '1'+'0'*(k-1) Trường hợp a
else:
for i in range(1,10):
if cnt[i] == k:
c = chr(i+48)
if cubes[0] == cubes[i]: ans = c + '0'*k
else:ans = c*(k+1)
break
Trường hợp b
print(ans) Trường hợp c
def get_first():
global m, k, m4
m4 = m*m*(m-2) - (m-1)*(m-1)*(m-3)
t = 0
a = k//m4+1
if a > m:
t = a-m
a = m
k = k%m4 + t*m4
if a == m:
m4 = m*(m-2)
else: m4 = m*(m-2) - (m-1)*(m-3)
t = 0
b = k//m4+1
if b > m: t, b = b-m, m
k = k%m4 + t*m4
if a == m or b == m: m4 = m-2
else: m4 = 1
t = 0
c = k//m4+1
if c > m: t, c = c-m, m
k = k%m4 + t*m4
d = 3 + k
if a<m and b<m and c<m: d = m
print(a, b, c, d)
n = int(input())
for i in range(n):
k = int(input())
m = 3
m4 = m*m*m*(m-2) - (m-1)*(m-1)*(m-1)*(m-3)
while k > m4:
k -= m4
m += 1
m4 = m*m*m*(m-2) - (m-1)*(m-1)*(m-1)*(m-3)
k -= 1
get_first()
print("\nTime: {:.4f}".format(time.time()-tb))
fo.close()