题目
解题思路
S ( n ) = { n , ( 0 < = n < K ) ∑ i = 0 K − 1 b i ∗ a n % K ∗ S ( ( ⌊ n K ⌋ ) − 1 ) ∗ K + i ) , n > = K S(n)= \left\{ \begin{array} {lc} n, (0<=n<K) \\ \sum_{i=0}^{K-1}b_i*a_{n\%K}*S((\lfloor\frac{n}{K}\rfloor)-1) * K+i),n>=K \end{array} \right. S(n)={n,(0<=n<K)∑i=0K−1bi∗an%K∗S((⌊Kn⌋)−1)∗K+i),n>=K
如果按K进行分块的话,则有:
[
S
(
K
)
S
(
K
+
1
)
.
.
.
S
(
K
+
K
−
1
)
]
=
[
a
0
b
0
a
0
b
1
.
.
.
a
0
b
K
a
1
b
0
a
1
b
1
.
.
.
a
1
b
K
.
.
.
.
.
.
.
.
.
.
.
.
a
K
−
1
b
0
a
K
−
1
b
1
.
.
.
a
K
−
1
b
K
−
1
]
[
S
(
0
)
S
(
1
)
.
.
.
S
(
K
−
1
)
]
\begin{bmatrix} S(K) \\ S(K+1) \\ ... \\ S(K+K-1) \end{bmatrix}=\begin{bmatrix} a_0b_0 & a_0b_1 & ... & a_0b_K \\ a_1b_0 & a_1b_1 & ... & a_1b_K \\ ... & ... & ... &... \\ a_{K-1}b_0 & a_{K-1}b_1 & ... & a_{K-1}b_{K-1}\end{bmatrix} \begin{bmatrix} S(0) \\ S(1) \\ ... \\ S(K - 1) \end{bmatrix}
⎣⎢⎢⎡S(K)S(K+1)...S(K+K−1)⎦⎥⎥⎤=⎣⎢⎢⎡a0b0a1b0...aK−1b0a0b1a1b1...aK−1b1............a0bKa1bK...aK−1bK−1⎦⎥⎥⎤⎣⎢⎢⎡S(0)S(1)...S(K−1)⎦⎥⎥⎤
通过递推也有:
[
S
(
K
∗
n
)
S
(
K
∗
n
+
1
)
.
.
.
S
(
K
∗
n
+
K
−
1
)
]
=
[
a
0
b
0
a
0
b
1
.
.
.
a
0
b
K
a
1
b
0
a
1
b
1
.
.
.
a
1
b
K
.
.
.
.
.
.
.
.
.
.
.
.
a
K
−
1
b
0
a
K
−
1
b
1
.
.
.
a
K
−
1
b
K
−
1
]
n
[
S
(
0
)
S
(
1
)
.
.
.
S
(
K
−
1
)
]
\begin{bmatrix} S(K * n) \\ S(K * n+1) \\ ... \\ S(K * n+K-1) \end{bmatrix}=\begin{bmatrix} a_0b_0 & a_0b_1 & ... & a_0b_K \\ a_1b_0 & a_1b_1 & ... & a_1b_K \\ ... & ... & ... &... \\ a_{K-1}b_0 & a_{K-1}b_1 & ... & a_{K-1}b_{K-1}\end{bmatrix} ^ n \begin{bmatrix} S(0) \\ S(1) \\ ... \\ S(K - 1) \end{bmatrix}
⎣⎢⎢⎡S(K∗n)S(K∗n+1)...S(K∗n+K−1)⎦⎥⎥⎤=⎣⎢⎢⎡a0b0a1b0...aK−1b0a0b1a1b1...aK−1b1............a0bKa1bK...aK−1bK−1⎦⎥⎥⎤n⎣⎢⎢⎡S(0)S(1)...S(K−1)⎦⎥⎥⎤
另有:
[
a
0
b
0
a
0
b
1
.
.
.
a
0
b
K
a
1
b
0
a
1
b
1
.
.
.
a
1
b
K
.
.
.
.
.
.
.
.
.
.
.
.
a
K
−
1
b
0
a
K
−
1
b
1
.
.
.
a
K
−
1
b
K
−
1
]
n
=
(
[
a
0
a
1
.
.
.
a
K
−
1
]
[
b
0
b
1
.
.
.
b
K
−
1
]
)
n
=
[
a
0
a
1
.
.
.
a
K
−
1
]
(
[
b
0
b
1
.
.
.
b
K
−
1
]
[
a
0
a
1
.
.
.
a
K
−
1
]
)
n
−
1
[
b
0
b
1
.
.
.
b
K
−
1
]
=
[
a
0
a
1
.
.
.
a
K
−
1
]
C
n
−
1
[
b
0
b
1
.
.
.
b
K
−
1
]
=
C
n
−
1
[
a
0
a
1
.
.
.
a
K
−
1
]
[
b
0
b
1
.
.
.
b
K
−
1
]
\begin{bmatrix} a_0b_0 & a_0b_1 & ... & a_0b_K \\ a_1b_0 & a_1b_1 & ... & a_1b_K \\ ... & ... & ... &... \\ a_{K-1}b_0 & a_{K-1}b_1 & ... & a_{K-1}b_{K-1}\end{bmatrix}^n\\=(\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix} \begin{bmatrix}b_0&b_1&...&b_{K-1} \end{bmatrix})^n\\=\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix} (\begin{bmatrix}b_0&b_1&...&b_{K-1} \end{bmatrix}\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix})^{n-1}\begin{bmatrix}b_0&b_1&...&b_{K-1} \end{bmatrix}\\=\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix} C^{n-1}\begin{bmatrix}b_0&b_1&...&b_{K-1} \end{bmatrix}\\=C^{n-1}\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix} \begin{bmatrix}b_0&b_1&...&b_{K-1} \end{bmatrix}
⎣⎢⎢⎡a0b0a1b0...aK−1b0a0b1a1b1...aK−1b1............a0bKa1bK...aK−1bK−1⎦⎥⎥⎤n=(⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤[b0b1...bK−1])n=⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤([b0b1...bK−1]⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤)n−1[b0b1...bK−1]=⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤Cn−1[b0b1...bK−1]=Cn−1⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤[b0b1...bK−1]
[
a
0
a
1
.
.
.
a
K
−
1
]
[
b
0
b
1
.
.
.
b
K
−
1
]
[
S
(
0
)
S
(
1
)
.
.
.
S
(
K
−
1
)
]
=
[
a
0
a
1
.
.
.
a
K
−
1
]
∑
i
=
0
K
−
1
b
i
S
(
i
)
=
[
a
0
∑
i
=
0
K
−
1
b
i
S
(
i
)
a
1
∑
i
=
0
K
−
1
b
i
S
(
i
)
.
.
.
a
K
−
1
∑
i
=
0
K
−
1
b
i
S
(
i
)
]
\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix} \begin{bmatrix}b_0&b_1&...&b_{K-1} \end{bmatrix} \begin{bmatrix} S(0) \\ S(1) \\ ... \\ S(K - 1) \end{bmatrix}\\=\begin{bmatrix} a_0 \\ a_1 \\ ... \\ a_{K-1} \end{bmatrix}\sum_{i=0}^{K-1}b_iS(i)\\=\begin{bmatrix} a_0\sum_{i=0}^{K-1}b_iS(i) \\ a_1\sum_{i=0}^{K-1}b_iS(i) \\ ... \\ a_{K-1}\sum_{i=0}^{K-1}b_iS(i) \end{bmatrix}
⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤[b0b1...bK−1]⎣⎢⎢⎡S(0)S(1)...S(K−1)⎦⎥⎥⎤=⎣⎢⎢⎡a0a1...aK−1⎦⎥⎥⎤∑i=0K−1biS(i)=⎣⎢⎢⎡a0∑i=0K−1biS(i)a1∑i=0K−1biS(i)...aK−1∑i=0K−1biS(i)⎦⎥⎥⎤
只要使用一个快速幂即可。
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
template <class T>
void read(T &x) {
x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
}
void write(int x) {
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
const int N = 2e5 + 100;
int n, m, MOD;
int a[N], b[N];
ll q[N];
ll qpow(ll x, ll n) {
ll res = 1;
while (n > 0) {
if (n & 1) res = res * x % MOD;
x = x * x % MOD;
n /= 2;
}
return res;
}
int main() {
//freopen("0.txt", "r", stdin);
int T; scanf("%d", &T);
while (T--) {
read(n); read(m); read(MOD);
for (int i = 0; i < n; i++) read(a[i]);
for (int i = 0; i < n; i++) read(b[i]);
for (int i = 0; i < m; i++) read(q[i]);
int R = 0, C = 0;
for (int i = 0; i < n; i++) {
R = (R + 1LL * i * b[i]) % MOD;
C = (C + 1LL * a[i] * b[i]) % MOD;
}
for (int i = 0; i < m; i++) {
if (q[i] < n) write(q[i] % MOD), puts("");
else write(qpow(C, q[i] / n - 1) * R % MOD * a[q[i] % n] % MOD), puts("");
}
}
return 0;
}