Practice OLP MT&TN lần 7 - năm 2026 - Bảng Không Chuyên

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Ước phi thường (Ôn tập OLP MT&TN lần 7) 100 (p) 1.0s 512M
2 Mã khóa (Ôn tập OLP MT&TN lần 7) 100 (p) 1.0s 512M
3 Rank của hoán vị (Ôn tập OLP MT&TN lần 7) 100 (p) 1.0s 512M

1. Ước phi thường (Ôn tập OLP MT&TN lần 7)

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Cô giáo Mẫn đang dẫn dắt đội ngũ kỹ sư phát triển ứng dụng đọc báo SetNews. Để tối ưu hóa thuật toán phân phối các bài báo vào bộ nhớ đệm (cache), hệ thống cần chia tổng số lượng bài viết \(n\) thành các cụm đều nhau.

Cô Mẫn yêu cầu team phát triển phải tìm ra cách chia sao cho kích thước của một cụm (gọi là \(d\)) là lớn nhất có thể để giảm thiểu số lượng cụm cần quản lý. Tuy nhiên, để đảm bảo tính phân tán, kích thước \(d\) không được phép là một ước tầm thường của \(n\) (nghĩa là \(d\) phải khác 1 và \(n\)).

Nhiệm vụ của bạn là giúp team SetNews viết một chương trình nhận vào số nguyên dương \(n\) và in ra ước dương \(d\) lớn nhất thỏa mãn yêu cầu của cô giáo Mẫn. Nếu không tồn tại cách chia nào hợp lệ, hãy in ra -1.

Input

  • Gồm một dòng duy nhất chứa số nguyên dương \(n\).
  • Giới hạn: \(n \le 10^{14}\).

Output

  • In ra một số nguyên duy nhất là ước dương không tầm thường lớn nhất của \(n\). Nếu không có ước nào thỏa mãn, in ra -1.

Example

Test 1

Input
6
Output
3
Note

Các ước dương của 6 là 1, 2, 3 và 6. Các ước không tầm thường là 2 và 3. Ước không tầm thường lớn nhất là 3.

Scoring

  • Subtask 1 (60% số điểm): \(n \le 10^6\)
  • Subtask 2 (40% số điểm): \(n \le 10^{14}\)

2. Mã khóa (Ôn tập OLP MT&TN lần 7)

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Cô Mẫn cùng team đang xây dựng một tính năng mới mang tên "Giải đố nhận tin VIP" cho SetNews. Mỗi ngày, hệ thống sẽ tự động sinh ra một mã khóa bảo mật dựa trên một số nguyên dương \(x\) ban đầu để thử thách người dùng.

Thuật toán tạo mã khóa của SetNews thực hiện chính xác \(k\) bước biến đổi. Ở mỗi bước, giá trị của \(x\) được cập nhật theo quy luật sau:

  • Gọi \(a\) là số nguyên tạo thành bằng cách sắp xếp các chữ số của \(x\) theo thứ tự tăng dần (bỏ qua các chữ số \(0\) vô nghĩa ở đầu nếu có).
  • Gọi \(b\) là số nguyên tạo thành bằng cách sắp xếp các chữ số của \(x\) theo thứ tự giảm dần.
  • Nếu \(x\) là số chẵn, giá trị mới của \(x\) được gán bằng hiệu: \(x = b - a\).
  • Nếu \(x\) là số lẻ, giá trị mới của \(x\) được gán bằng hiệu: \(x = x - a\).

Ví dụ, với \(x = 104\):

  • \(x\) là số chẵn.
  • Sắp xếp tăng dần: \(014 \rightarrow a = 14\).
  • Sắp xếp giảm dần: \(410 \rightarrow b = 410\).
  • Giá trị \(x\) mới: \(x = 410 - 14 = 396\).

Yêu cầu: Cho giá trị ban đầu \(x\) và số bước biến đổi \(k\), hãy giúp cô Mẫn và team SetNews xác định giá trị cuối cùng của mã khóa \(x\) sau khi thực hiện đủ \(k\) phép biến đổi.

Input

  • Dòng duy nhất chứa hai số nguyên dương \(x\) và \(k\) \((1 \le x,k \le 10^{18})\).

Output

  • In ra một số nguyên duy nhất là giá trị của \(x\) sau \(k\) bước biến đổi.

Example

Test 1

Input
21 2
Output
0
Note
  • Bước 1: \(x = 21\) (số lẻ). \(a = 12, b = 21\). Giá trị mới: \(x = 21 - 12 = 9\).
  • Bước 2: \(x = 9\) (số lẻ). \(a = 9, b = 9\). Giá trị mới: \(x = 9 - 9 = 0\).
  • Sau 2 bước, \(x = 0\).

Test 2

Input
104 2
Output
594
Note
  • Bước 1: \(x = 104\) (số chẵn). \(a = 14, b = 410\). Giá trị mới: \(x = 410 - 14 = 396\).
  • Bước 2: \(x = 396\) (số chẵn). \(a = 369, b = 963\). Giá trị mới: \(x = 963 - 369 = 594\).
  • Sau 2 bước, \(x = 594\).

Scoring

  • Subtask 1 (\(30\%\) số điểm): \(x, k \le 10^5\)
  • Subtask 2 (\(30\%\) số điểm): \(x \le 10^{18}, k \le 10^5\)
  • Subtask 3 (\(40\%\) số điểm): \(x, k \le 10^{18}\)

3. Rank của hoán vị (Ôn tập OLP MT&TN lần 7)

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Cô giáo Mẫn đang dẫn dắt đội ngũ phát triển phần mềm cho ứng dụng đọc báo SetNews. Để tăng trải nghiệm cá nhân hóa, ứng dụng có một tính năng sắp xếp giao diện hiển thị các chuyên mục tin tức trên trang chủ. Giả sử SetNews có \(n\) chuyên mục khác nhau được đánh số từ 1 đến \(n\). Cách sắp xếp các chuyên mục này trên màn hình được biểu diễn bởi một hoán vị của tập hợp \((1, 2, \dots, n)\).

Hiện tại, giao diện của người dùng đang hiển thị các chuyên mục theo thứ tự hoán vị \(p_1, p_2, \dots, p_n\). Cô giáo Mẫn yêu cầu team phát triển thêm một nút bấm "Trượt Chuyên Mục" để gợi ý luồng tin mới. Thay vì xáo trộn ngẫu nhiên, khi người dùng bấm nút này, thuật toán sẽ tìm hoán vị có thứ tự từ điển lớn hơn hoán vị hiện tại đúng \(k\) bước. Cụ thể, nếu gọi \(rank(p)\) là thứ tự từ điển của hoán vị \(p\), hệ thống cần tìm hoán vị \(q\) sao cho \(rank(q) - rank(p) = k\). Quy ước hoán vị tăng dần \((1, 2, \dots, n)\) có rank là 1, và hoán vị giảm dần \((n, n-1, \dots, 1)\) có rank là \(n!\).

Bạn hãy giúp team SetNews viết phần lõi thuật toán cho tính năng này nhé!

Input

  • Dòng đầu tiên chứa hai số nguyên dương \(n\) và \(k\) mô tả số lượng chuyên mục và số bước trượt.
  • Dòng thứ hai chứa \(n\) số nguyên phân biệt \(p_1, p_2, \dots, p_n\) là một hoán vị của tập \((1, 2, \dots, n)\), thể hiện thứ tự hiển thị hiện tại. Dữ liệu đảm bảo rằng \(rank(p) + k \le n!\).

Output

  • In ra một dòng duy nhất chứa \(n\) số nguyên phân biệt \(q_1, q_2, \dots, q_n\) là hoán vị thể hiện thứ tự hiển thị của các chuyên mục sau khi người dùng bấm nút trượt.

Example

Test 1

Input
4 1
1 2 3 4
Output
1 2 4 3
Note

Hoán vị ban đầu là (1, 2, 3, 4) có thứ tự từ điển là 1. Số bước trượt \(k = 1\). Hoán vị cần tìm phải có thứ tự từ điển là \(1 + 1 = 2\). Hoán vị liền kề lớn hơn tiếp theo chính là (1, 2, 4, 3).

Scoring

  • Subtask 1 (80 points): \(n \le 10^5, k \le 10^5\)
  • Subtask 2 (20 points): \(n \le 10^5, k \le 10^{12}\)