Encrypting Messages (Codeforces 177D2)
Tags: Others, data structures

The Smart Beaver from ABBYY invented a new message encryption method and now wants to check its performance. Checking it manually is long and tiresome, so he decided to ask the ABBYY Cup contestants for help.A message is a sequence of n integers a1, a2, ..., an. Encryption uses a key which is a sequence of m integers b1, b2, ..., bm (m ≤ n). All numbers from the message and from the key belong to the interval from 0 to c - 1, inclusive, and all the calculations are performed modulo c.Encryption is performed in n - m + 1 steps. On the first step we add to each number a1, a2, ..., am a corresponding number b1, b2, ..., bm. On the second step we add to each number a2, a3, ..., am + 1 (changed on the previous step) a corresponding number b1, b2, ..., bm. And so on: on step number i we add to each number ai, ai + 1, ..., ai + m - 1 a corresponding number b1, b2, ..., bm. The result of the encryption is the sequence a1, a2, ..., an after n - m + 1 steps.Help the Beaver to write a program that will encrypt messages in the described manner.

Input: The first input line contains three integers n, m and c, separated by single spaces. The second input line contains n integers ai (0 ≤ ai < c), separated by single spaces — the original message. The third input line contains m integers bi (0 ≤ bi < c), separated by single spaces — the encryption key.The input limitations for getting 30 points are:   1 ≤ m ≤ n ≤ 103  1 ≤ c ≤ 103  The input limitations for getting 100 points are:   1 ≤ m ≤ n ≤ 105  1 ≤ c ≤ 103  

Output: Print n space-separated integers — the result of encrypting the original message.

Note: In the first sample the encryption is performed in two steps: after the first step a = (0, 0, 0, 1) (remember that the calculations are performed modulo 2), after the second step a = (0, 1, 1, 0), and that is the answer. 

Sample Inputs:
4 3 2
1 1 1 1
1 1 1

3 1 5
1 2 3
4

Sample Outputs:
0 1 1 0

0 1 2

Solution (Python):
import sys

def encryptinging_messages(n: int, m: int, c: int):
    input = sys.stdin.readline
    arr = [int(x) for x in input().split()]
    key = [int(x) for x in input().split()]
    diff = [0 for _ in range(n)]
    for i in range(m):
        (left, right) = (i, i + n - m + 1)
        diff[left] = (diff[left] - key[i]) % c
        if right < n:
            diff[right] = (diff[right] + key[i]) % c
    diff[0] = -diff[0] % c
    for i in range(1, n):
        diff[i] = (diff[i - 1] - diff[i]) % c
    for i in range(n):
        diff[i] = str((diff[i] + arr[i]) % c)
    return ' '.join(diff)

def main():
    (n, m, c) = map(int, input().split())
    print(encryptinging_messages(n, m, c))
if __name__ == '__main__':
    main()

Solution (Python):
(len_message, len_key, mod) = map(int, input().split())
message = list(map(int, input().split()))
key = list(map(int, input().split()))
(sum, low, high) = (0, 0, 0)
result = message[:]
for i in range(len_message):
    if high < len_key:
        sum += key[high]
        high += 1
    if i + len_key > len_message:
        sum -= key[low]
        low += 1
    result[i] = (result[i] + sum) % mod
print(' '.join(map(str, result)))

Solution (Python):
def main():
    (n, m, c) = map(int, input().split())
    msgs = list(map(int, input().split()))
    encKeys = [0] + list(map(int, input().split()))
    for i in range(1, m + 1):
        encKeys[i] += encKeys[i - 1]
    for (i, msg) in enumerate(msgs):
        right = min(i + 1, m)
        left = max(0, m - (n - i))
        msgs[i] = (msg + encKeys[right] - encKeys[left]) % c
    print(*msgs)
if __name__ == '__main__':
    main()