Bộ Năm Số

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

Trên dãy số nguyên ~a_1,a_2,...,a_n~ và với hai số nguyên ~w_1,w_2~, ta định nghĩa một bộ năm chỉ số ~1 \le i_1 < i_2 < ... < i_5 \le n~ được gọi là bộ năm và có trọng số được tính bằng: ~(w_1 \times a_{i_1}) + (w_2 \times a_{i_2}) + a_3 + (w_2 \times a_{i_4}) + (w_1 \times a_{i_5})~.

Ví dụ, trên dãy gồm ~7~ số nguyên ~2,8,1,9,1,-1,8~ và ~w_1 = 1~, ~w_2 = -1~ thì bộ năm chỉ số ~2,3,4,6,7~ là một bộ năm có trọng số bằng ~(1 \times 8) + (-1 \times 1) + 9 + (-1 \times (-1)) + (1 \times 8) =25~, đây cũng là bộ năm có trọng số lớn nhất trong tất cả các bộ năm.

Yêu cầu: Cho dãy số ~a_1,a_2,...,a_n~ và hai số nguyên ~w_1~ và ~w_2~. Hãy tìm bộ năm có trọng số lớn nhất.

Input

  • Dòng đầu chứa ba số nguyên ~n,w_1,w_2~ ~(5 \le n \le 10^5; |w_1|, |w_2| \le 100)~
  • Dòng thứ hai gồm ~n~ số nguyên ~a_1,a_2,...,a_n~ ~(|a_i| \le 10^9)~.

Output

  • Gồm một số nguyên là trọng số của bộ năm lớn nhất tìm được.

Subtask

  • Có ~20\%~ số test ứng với ~1 \le n \le 100~
  • Có ~20\%~ số test ứng với ~w_1 = w_2 = 0~
  • Có ~20\%~ số test ứng với ~n \le 5000, w_1 = 0~
  • Có ~20\%~ số test ứng với ~w_1 = 0~
  • Có ~20\%~ số test còn lại không có giới hạn gì thêm.

Sample Input 1

7 1 -1
2 8 1 9 1 -1 8

Sample Output 1

25

Sample Input 2

7 0 0
2 8 1 9 1 -1 8

Sample Output 2

9

Tích chập

Nộp bài
Time limit: 1.0 / Memory limit: 549M

Point: 100


Chia xâu đối xứng

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

Một xâu ~S~ được gọi là xâu đối xứng nếu ~S = S'~ với ~S'~ là xâu nhận được từ xâu ~S~ khi đọc từ phải qua trái. Ví dụ: Xâu ~'aba'~ là xâu đối xứng, còn xâu ~'abc'~ là xâu không đối xứng.

Cho một xâu ~S~ gồm ~1 \le n \le 1000~ kí tự.

Yêu cầu: Hãy tìm cách chia xâu ~S~ thành ít nhất các đoạn mà mỗi đoạn đều là các xâu đối xứng.

Input

  • Dòng đầu gồm một số nguyên ~n~ là độ dài của xâu ~S~.
  • Dòng thứ hai là nội dung xâu ~S~.

Output

  • Dòng đầu ghi một số nguyên ~k~ (số đoạn ít nhất tìm được).
  • ~K~ dòng sau, mỗi dòng ghi một số nguyên ~t_i~, với ~t_i~ là vị trí kết thúc của đoạn thứ ~i~.

Sample Input 1

 8
 abbacdcb

Sample Output 1

3
4
7
8

Time limit: 1.0 / Memory limit: 256M

Point: 100

Cho một số nguyên dương ~n~, hãy phân tích số ~n~ thành tổng của một số số nguyên dương sao cho bội chung nhỏ nhất của chúng là lớn nhất có thể.

Input

  • Gồm một số nguyên dương ~n~, ~(1 \le n \le 340)~

Output

  • In ra bội chung nhỏ nhất tìm được.

Sample Test

Input:

10

Output:

30

Giải thích: Số ~10~ được phân tích thành tổng của ~3~ số ~{2,3,5}~, bội chung nhỏ nhất của ba số đó bằng ~30~, đây là kết quả lớn nhất có thể.


Dãy Sắc Màu

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

Sau khi chơi với ngọc chán chê, Tí sắp ~n~ viên ngọc ra một đường thẳng và bắt đầu nhìn ngắm chúng. Tí nhận thấy rằng có không quá ~k~ màu ngọc khác nhau trên bàn và viên ngọc thứ ~i~ từ trái sang thì có màu ~a_i~. Tí muốn chia dãy ngọc thành các đoạn liên tiếp sao cho mỗi đoạn đều có đủ ~k~ màu. Hỏi Tí có bao nhiêu cách chia thỏa mãn như vậy?

Yêu cầu: In số cách chia thỏa mãn sau khi ~\mod 10^9+7~

Input
  • Dòng đầu tiên chứa hai số nguyên dương ~n,k~.
  • Dòng thứ hai chứa ~n~ số nguyên ~a_1,a_2,...,a_n~.
Output
  • Ghi ra một số nguyên là kết quả bài toán.
Constraints
  • ~1\leq k\leq n\leq 10^6~
  • ~1\leq a_i\leq k~
Scoring
  • Subtask ~1~ (~20\%~ số điểm): ~k = 1~.
  • Subtask ~2~ (~20\%~ số điểm): ~n\leq 5000~.
  • Subtask ~3~ (~20\%~ số điểm): ~n\leq 10^5, k\leq 100~.
  • Subtask ~4~ (~40\%~ số điểm): Không có ràng buộc gì thêm.
Example

Sample Input ~1~

5 2
1 2 2 1 2 

Sample Ouput ~1~

3

Explanation

Có ~3~ cách chia như sau: ~(1\ 2) | (2\ 1\ 2), (1\ 2\ 2) | (1\ 2)~, hoặc ~(1\ 2\ 2\ 1\ 2)~.


Jumping

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

Hè đã tới, ~mrtee~ muốn cho các học sinh của mình vận động một chút. Thầy đã lập ra một cuộc thi nhảy xa, tuy nhiên điều luật của nó thì rất lạ.

Nếu chiếu trên trục ~OX~, đường nhảy sẽ bắt đầu từ điểm ~1~ và kết thúc tại điểm ~n~. Bạn sẽ xuất phát từ điểm ~0~ và được nhảy bao nhiêu lượt tùy thích, miễn là không ra khỏi phạm vi ~[1,n]~. Tuy nhiên, mỗi lượt bạn phải nhảy một quãng đường nguyên dương và ở lần nhảy thứ ~i~, bạn phải nhảy một quãng đường có độ chia hết cho ~k+i-1~. Tất nhiên, bạn sẽ được cung cấp trước ~2~ giá trị ~n~ và ~k~.

Là một ~coder~ yêu thích toán học, bạn không quan tâm tới việc thắng thua trong cuộc thi này lắm, mà chỉ hứng thú với việc đếm xem với mỗi vị trí ~i~ thuộc đoạn ~[1,n]~, có bao nhiêu cách nhảy khác nhau từ điểm xuất phát tới đó.

Hãy thử lập trình và giải đáp câu hỏi ấy!

Input


  • Gồm một dòng chứa hai số nguyên dương ~n, k~.

Output


  • In ra ~n~ số nguyên, số thứ ~i~ là số cách để nhảy từ điểm ~0~ tới điểm ~i~, vì kết quả có thể rất lớn nên hãy lấy phần dư với modulo ~10^9+7~.

Constraints


  • ~1 \le k \le n \le 2*10^5~

Subtasks


  • ~35\%~ số điểm: ~n \le 300~.
  • ~40\%~ số điểm: ~n \le 4000~.
  • ~25\%~ số điểm: ~n \le 2*10^5~.

Sample Test 1


Input:

12 1

Output:

1 1 2 2 3 4 5 6 8 10 12 15



Sample Test 2


Input:

15 3

Output:

0 0 1 0 0 1 1 0 1 1 1 2 1 1 3



Giải thích


  • Ở ví dụ ~1~, các cách để đến điểm ~6~ là ~[0,6],[0,4,6],[0,2,6],[0,1,3,6]~.
  • Ở ví dụ ~2~, các cách để đến điểm ~15~ là ~[0,15],[0,3,12],[0,6,10,15]~

Bin Packing

Nộp bài
Time limit: 1.0 / Memory limit: 1G

Point: 100

Một xí nghiệp có một robot dùng để xếp các sản phẩm vào các thùng. Mọi thùng đều có dung tích như nhau. Có đúng hai thùng đang mở sẵn để robot xếp các sản phẩm vào. Mỗi thùng bất kỳ đều chứa được số sản phẩm mà tổng dung tích của chúng không vượt quá dung tích của thùng. Robot có thể thực hiện các thao tác sau:

  • Đưa một sản phẩm hiện tại trên dãy băng vào thùng ~1~,
  • Đưa một sản phẩm hiện tại trên dãy băng vào thùng ~2~,
  • Đóng thùng ~1~ và mở một thùng mới thay thế cho thùng ~1~,
  • Đóng thùng ~2~ và mở một thùng mới thay thế cho thùng ~2~.

Các thao tác 1, 2 chỉ có thể thực hiện nếu tổng dung tích của sản phẩm cho vào và các sản phẩm đã có trong thùng không vượt quá dung tích của thùng.

Yêu cầu: Cho biết dung tích mỗi thùng là ~𝑊~, dung tích của ~𝑛 sản~ phẩm trên dãy băng theo thứ tự xuất hiện là ~𝑎_1, 𝑎_2, . . . , 𝑎_𝑛~ , hãy tìm số thùng ít nhất để có thể cho ~𝑛~ sản phẩm vào thùng.

Input

  • Dòng thứ nhất là hai số nguyên ~𝑊~ và ~𝑛~;
  • Dòng tiếp theo chứa các số mô tả các số ~𝑎_1, 𝑎_2, … , 𝑎_𝑛~.

Output

  • Gồm một số duy nhất là số thùng ít nhất cần dùng.

Input

8 6
4 2 5 3 5 4

Output

3

Giải thích

  • Đưa ~1~ vào thùng ~1~
  • Đưa ~2~ ~3~ ~4~ ~5~ vào thùng ~2~ (cần mở thêm một thùng)
  • Đưa ~6~ vào thùng ~1~ (vẫn còn đủ chỗ, không cần mở thêm)

Ràng buộc

  • Subtask 1 [10 tests] ~𝑊 ≤ 10^9 ; 𝑛 ≤ 20~
  • Subtask 2 [10 tests] ~1 ≤ 𝑎_𝑖 ≤ 2; 𝑊 = 100; 𝑛 ≤ 10^6~
  • Subtask 3 [10 tests] ~𝑊 ≤ 30; 𝑛 ≤ 10000~
  • Subtask 4 [10 tests] ~𝑊 ≤ 5000; 𝑛 ≤ 100~
  • Subtask 5 [10 tests] ~𝑊 ≤ 5000 ; 𝑛 ≤ 10000~

Trung bình cộng

Nộp bài
Time limit: 1.2 / Memory limit: 1G

Point: 100

Bạn được cho hai mảng có độ dài ~n~ .

  • Phần tử thứ ~i~ của mảng thứ nhất là ~a_i~ .
  • Phần tử thứ ~i~ của mảng thứ hai là ~b_i~ .

Một cách chia cả hai mảng thành các mảng con không rỗng được gọi là tốt nếu thỏa mãn các điều kiện sau:

  • Mỗi phần tử thuộc đúng một mảng con duy nhất.
  • Số lượng mảng con của cả hai mảng bằng nhau, tức là nếu mảng thứ nhất được chia thành đúng ~k~ mảng con, thì mảng thứ hai cũng phải được chia thành đúng ~k~ mảng con.
  • Với mọi ~1 \leq i \leq k~, trung bình cộng của mảng con thứ ~i~ bên trái mảng thứ nhất phải nhỏ hơn hoặc bằng trung bình cộng của mảng con thứ ~i~ bên trái mảng thứ hai.

Yêu cầu: Tính số cách để chia cả hai mảng thành các mảng con không rỗng thỏa mãn các điều kiện trên. Kết quả phải được chia dư với ~10^9 + 7~. Hai cách được xem là khác nhau nếu số lượng mảng con khác nhau hoặc nếu một phần tử thuộc về mảng con khác nhau.

Dữ liệu vào từ tệp văn bản: TRUNGBINHCONG.INP

  • Dòng đầu tiên chứa số nguyên ~n~ ~(1 \leq n \leq 500)~.
  • Dòng tiếp theo chứa ~n~ số nguyên ~a_1, a_2, \dots, a_n~ ~(1 \leq a_i \leq 10^6)~.
  • DDòng cuối cùng chứa ~N~ số nguyên ~b_1, b_2, \dots, b_n~ ~(1 \leq b_i \leq 10^6)~.

Kết quả ghi ra tệp văn bản: TRUNGBINHCONG.OUT

  • In ra số cách chia mảng thỏa mãn các điều kiện, chia dư với ~10^9 + 7~.

Scoring

  • Subtask ~1~ (~20\%~ số điểm): ~n \le 10~
  • Subtask ~2~ (~30\%~ số điểm): ~n \le 80~
  • Subtask ~3~ (~30\%~ số điểm): ~n \le 300~
  • Subtask ~4~ (~20\%~ số điểm): Không giới hạn gì thêm.

Example

Sample Input 1
3
1 3 2
2 2 2
Sample Output 1
3

Note

Ba cách hợp lệ là:

  • Chia mảng thứ nhất thành ~[1, 3], [2]~ và mảng thứ hai thành ~[2, 2], [2]~.
  • Chia mảng thứ nhất thành ~[1, 3], [2]~ và mảng thứ hai thành ~[2], [2, 2]~.
  • Chia mảng thứ nhất thành ~[1, 3, 2]~ và mảng thứ hai thành ~[2, 2, 2]~.

KDIVPATH

Nộp bài
Time limit: 1.0 / Memory limit: 256M

Point: 100

Tìm đường đi ngắn nhất trong đồ thị không trọng số là bài toán cơ bản mà hầu hết sinh viên khoa học máy tính đều học trong lớp giải thuật đầu tiên.

Tuy nhiên, đây là một biến thể khó hơn: cho một đồ thị có hướng không trọng số với các cạnh có độ dài ~1~, hãy tìm đường đi ngắn nhất chia hết cho ~K~ từ đỉnh nguồn ~0~ đến tất cả các đỉnh còn lại!

Lưu ý rằng cạnh lặp có thể xuất hiện.

Lưu ý rằng đường đi có thể đi qua cùng một đỉnh hoặc cạnh nhiều lần.

Input

  • Dòng đầu chứa số nguyên ~T~ — số test case.
  • Mỗi test case bắt đầu bằng ~3~ số nguyên ~V~, ~E~, ~K~: số đỉnh, số cạnh và giá trị ~K~.
  • ~E~ dòng tiếp theo, mỗi dòng chứa ~2~ số nguyên ~u~, ~v~ mô tả một cạnh có hướng từ ~u~ đến ~v~.
  • Các cạnh không bị trùng nhau.
  • ~1 \le T \le 10~
  • ~1 \le V \le 300~
  • ~0 \le E \le V^2~
  • ~1 \le K \le 30\,000~

Output

  • Với mỗi test case, in ra một dòng chứa ~V~ số nguyên: độ dài đường đi ngắn nhất chia hết cho ~K~ từ đỉnh ~0~ đến từng đỉnh ~i~. Nếu không tồn tại đường đi thỏa mãn, in ~-1~. Số đầu tiên luôn là ~0~.

Sample Input 1

3
3 3 2
0 1
1 2
2 0
4 12 3
0 1
0 2
0 3
1 0
1 2
1 3
2 0
2 1
2 3
3 0
3 1
3 2
4 5 7
0 1
0 3
1 1
2 2
3 3

Sample Output 1

0 4 2
0 3 3 3
0 7 -1 7