@@ -39,18 +39,15 @@ using std::vector;
39
39
#define pb push_back
40
40
#define MOD 1000000007
41
41
42
- /* * returns absolute value */
43
- inline ll ab (ll x) { return x > 0LL ? x : -x; }
44
-
45
- /* * global variable k
42
+ /* * global variable mat_size
46
43
* @todo @stepfencurryxiao add documetnation
47
44
*/
48
- ll k ;
45
+ ll mat_size ;
49
46
50
- /* * global vector variables
47
+ /* * global vector variables used in the ::ans function.
51
48
* @todo @stepfencurryxiao add documetnation
52
49
*/
53
- vector<ll> a, b, c ;
50
+ vector<ll> fib_b, fib_c ;
54
51
55
52
/* * To multiply 2 matrices
56
53
* \param [in] A matrix 1 of size (m\f$\times\f$n)
@@ -59,10 +56,10 @@ vector<ll> a, b, c;
59
56
*/
60
57
vector<vector<ll>> multiply (const vector<vector<ll>> &A,
61
58
const vector<vector<ll>> &B) {
62
- vector<vector<ll>> C (k + 1 , vector<ll>(k + 1 ));
63
- for (ll i = 1 ; i <= k ; i++) {
64
- for (ll j = 1 ; j <= k ; j++) {
65
- for (ll z = 1 ; z <= k ; z++) {
59
+ vector<vector<ll>> C (mat_size + 1 , vector<ll>(mat_size + 1 ));
60
+ for (ll i = 1 ; i <= mat_size ; i++) {
61
+ for (ll j = 1 ; j <= mat_size ; j++) {
62
+ for (ll z = 1 ; z <= mat_size ; z++) {
66
63
C[i][j] = (C[i][j] + (A[i][z] * B[z][j]) % MOD) % MOD;
67
64
}
68
65
}
@@ -94,32 +91,32 @@ vector<vector<ll>> power(const vector<vector<ll>> &A, ll p) {
94
91
ll ans (ll n) {
95
92
if (n == 0 )
96
93
return 0 ;
97
- if (n <= k )
98
- return b [n - 1 ];
94
+ if (n <= mat_size )
95
+ return fib_b [n - 1 ];
99
96
// F1
100
- vector<ll> F1 (k + 1 );
101
- for (ll i = 1 ; i <= k ; i++) F1[i] = b [i - 1 ];
97
+ vector<ll> F1 (mat_size + 1 );
98
+ for (ll i = 1 ; i <= mat_size ; i++) F1[i] = fib_b [i - 1 ];
102
99
103
100
// Transpose matrix
104
- vector<vector<ll>> T (k + 1 , vector<ll>(k + 1 ));
105
- for (ll i = 1 ; i <= k ; i++) {
106
- for (ll j = 1 ; j <= k ; j++) {
107
- if (i < k ) {
101
+ vector<vector<ll>> T (mat_size + 1 , vector<ll>(mat_size + 1 ));
102
+ for (ll i = 1 ; i <= mat_size ; i++) {
103
+ for (ll j = 1 ; j <= mat_size ; j++) {
104
+ if (i < mat_size ) {
108
105
if (j == i + 1 )
109
106
T[i][j] = 1 ;
110
107
else
111
108
T[i][j] = 0 ;
112
109
continue ;
113
110
}
114
- T[i][j] = c[k - j];
111
+ T[i][j] = fib_c[mat_size - j];
115
112
}
116
113
}
117
114
// T^n-1
118
115
T = power (T, n - 1 );
119
116
120
117
// T*F1
121
118
ll res = 0 ;
122
- for (ll i = 1 ; i <= k ; i++) {
119
+ for (ll i = 1 ; i <= mat_size ; i++) {
123
120
res = (res + (T[1 ][i] * F1[i]) % MOD) % MOD;
124
121
}
125
122
return res;
@@ -133,19 +130,19 @@ int main() {
133
130
cin >> t;
134
131
ll i, j, x;
135
132
while (t--) {
136
- cin >> k ;
137
- for (i = 0 ; i < k ; i++) {
133
+ cin >> mat_size ;
134
+ for (i = 0 ; i < mat_size ; i++) {
138
135
cin >> x;
139
- b .pb (x);
136
+ fib_b .pb (x);
140
137
}
141
- for (i = 0 ; i < k ; i++) {
138
+ for (i = 0 ; i < mat_size ; i++) {
142
139
cin >> x;
143
- c .pb (x);
140
+ fib_c .pb (x);
144
141
}
145
142
cin >> x;
146
143
cout << ans (x) << endl;
147
- b .clear ();
148
- c .clear ();
144
+ fib_b .clear ();
145
+ fib_c .clear ();
149
146
}
150
147
return 0 ;
151
148
}
0 commit comments