-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkickstart_alarm.py
49 lines (38 loc) · 1.29 KB
/
kickstart_alarm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import sys
import collections
Input = collections.namedtuple('Input',
('N', 'K', 'x1', 'y1', 'C', 'D', 'E1', 'E2', 'F'))
def power(x, y):
ans, power = 1, y
if y < 0:
power, x = -power, 1 / x
while power:
if power & 1:
ans *= x
x, power = x ** 2, power >> 1
return ans
def compute_power_sum(arr, k):
result = 0
GP_sum = k
mod = 1_000_000_007
for x, A_x in enumerate(arr[1:], 1):
if x != 1:
GP_sum = GP_sum + (power(x, k+1)-1) * power(x-1, mod-2)
GP_sum %= mod
result = result + GP_sum * A_x
result %= mod
return result
if __name__ == '__main__':
T = int(input())
for case in range(1, T+1):
params = Input(*map(int, input().rstrip().split()))
A = [0] * (params.N+1)
A[1] = (params.x1 + params.y1) % params.F
old_xi, old_yi = params.x1, params.y1
for i in range(2, params.N+1):
xi = (params.C * old_xi + params.D * old_yi + params.E1) % params.F
yi = (params.D * old_xi + params.C * old_yi + params.E2) % params.F
old_xi, old_yi = xi, yi
A[i] = (xi + yi) % params.F
ans = compute_power_sum(A, params.K)
print('Case #'+str(case)+': '+str(int(ans)))