#CT00041. Mật mã hồi tiếp (Feedback Cipher)

    ID: 231 Loại: Thông thường 2000ms 256MiB Tried: 2 Đã chấp nhận: 2 Độ khó: 1 Đăng bởi: Nhãn>String AlgorithmsString processing basicsFundamentalsInteger arithmeticImplementation techniques

Mật mã hồi tiếp (Feedback Cipher)

Mật mã hồi tiếp (Feedback Cipher)

Phiên bản: Phước Hưng OJ Extended

Đề bài

Dùng bảng chữ cái thường a..z với giá trị a =0=0, b =1=1, …\ldots, z =25=25.

Ban đầu khóa hiện tại là k1=Kk_1=K, với 0≤K≤250\le K\le25. Ở vị trí ii, gọi pip_i là giá trị của ký tự gốc và cic_i là giá trị của ký tự đã mã hóa.

Khi mã hóa:

ci=(pi+ki) mod 26.c_i=(p_i+k_i)\bmod 26.

Sau khi xử lý vị trí ii, khóa được cập nhật bằng:

ki+1=(ki+pi+1) mod 26.k_{i+1}=(k_i+p_i+1)\bmod 26.

Khi giải mã, tại vị trí ii ta khôi phục:

pi=(ci−ki+26) mod 26,p_i=(c_i-k_i+26)\bmod 26,

sau đó khóa tiếp tục được cập nhật bằng chính giá trị pip_i vừa khôi phục.

Cho chế độ MM. Nếu M=1M=1, hãy mã hóa xâu SS. Nếu M=2M=2, hãy giải mã xâu SS. Việc xử lý luôn thực hiện từ trái sang phải.

Input

  • Dòng 1 chứa hai số nguyên MM và KK, trong đó M∈{1,2}M\in\{1,2\} và 0≤K≤250\le K\le25.
  • Dòng 2 chứa xâu SS chỉ gồm các chữ cái thường a..z.

Output

In xâu thu được sau khi thực hiện đúng chế độ đã cho.

Subtask

  • Subtask 1 (40 điểm): 1≤∣S∣≤1031\le |S|\le10^3.
  • Subtask 2 (60 điểm): 1≤∣S∣≤1061\le |S|\le10^6.

Ví dụ

Ví dụ 1

Input

1 3
hello

Output

kpbnc

Giải thích

Ban đầu K=3K=3. Ký tự h có giá trị 77, nên ký tự mã hóa đầu tiên có giá trị (7+3) mod 26=10(7+3)\bmod26=10, tức k.

Sau đó khóa được cập nhật thành (3+7+1) mod 26=11(3+7+1)\bmod26=11. Tiếp tục xử lý từ trái sang phải cho các ký tự còn lại, xâu kết quả là kpbnc.

Ví dụ 2

Input

2 3
kpbnc

Output

hello

Giải thích

Ban đầu K=3K=3. Ký tự mã hóa k có giá trị 1010, nên ký tự gốc đầu tiên có giá trị (10−3+26) mod 26=7(10-3+26)\bmod26=7, tức h.

Khóa được cập nhật bằng giá trị ký tự gốc vừa khôi phục. Tiếp tục theo đúng quy tắc, ta thu được xâu hello.