TopCoder

abcabcabc
有人要寫 p6 嗎 > <

User's AC Ratio

100.0% (2/2)

Submission's AC Ratio

100.0% (2/2)

Tags

Description

完整題本 PDF:中文英文馬來文

在初等數學中,我們學過實數的聯立方程式。假設有這樣一個聯立方程式:
$$
\left\{
\begin{array}{ccc}
A_{1, 1} x_1 + A_{1, 2} x_2 + \dots + A_{1, n} x_n & = & b_1 \\
A_{2, 1} x_1 + A_{2, 2} x_2 + \dots + A_{2, n} x_n & = & b_2 \\
\vdots & = & \vdots \\
A_{n, 1} x_1 + A_{n, 2} x_2 + \dots + A_{n, n} x_n & = & b_n
\end{array}
\right.
$$

這個著名的問題可以用高斯消去法來解決。該方法的概念相當簡單。我們對增廣矩陣 $[A|b]$ 應用基本行運算,即將一行的倍數加到另一行。可以證明,在這個運算之後,$Ax = b$ 的解不會受到影響。
然後,為了消去第 $n$ 項,我們查看第 $2$ 到第 $n$ 個方程,對於第 $i$ 個方程,我們找到係數 $c = -\frac{A_{i, n}}{A_{1, n}}$,並讓新的第 $i$ 行為:
$$(cA_{1, 1} + A_{i, 1})x_1 + (cA_{1, 2} + A_{i, 2})x_2 + \dots (cA_{1, n-1} + A_{i, n-1})x_{n-1} + (cA_{1, n} + A_{i, n})x_n = cb_1 + b_i$$
由於 $cA_{1, n} = -A_{i, n}$,實際上是:
$$(cA_{1, 1} + A_{i, 1})x_1 + (cA_{1, 2} + A_{i, 2})x_2 + \dots (cA_{1, n-1} + A_{i, n-1})x_{n-1} + 0x_n = cb_1 + b_i$$
因此第 $n$ 項在第 $i$ 個方程中被消去了。

類似地,這個過程可以套用在第 $n-1$ 項上。利用新產生的第二個等式,可以消去第三個到最後一個等式中的第 $n-1$ 項。重複進行這個消去 $n-1$ 次,會得到新的 $A'$ 和 $b'$,並且,滿足 $i > j$ 的 $A'{i, j}$ 都一定會是零。特別地,第 $n$ 個方程式會變成簡單的 $A'{n, 1}x_1 = b'_n$。在已知 $x_1$ 之後,第 $(n-1)$ 個方程式也只會剩下一個未知數 $x_2$。接著,再從第 $n$ 個方程式開始,回頭依序代入每一個等式到第一個為止,即可依序解出所有 $x$。整個過程僅需 $O(n ^ 3)$ 次運算即可完成。

這個方法直接且易於理解。然而,由於使用了除法,我們實際上無法在模運算的世界中使用這個方法來求解。但,我們真的不能嗎?

事實上,雖然除法通常在模運算的世界中不能直覺的使用,但我們可以用某種方式來定義除法。當我們思考除法的定義 $\frac{a}{b} = x$ 時,它實際上是找到 $x$ 使得 $x \times b = a$。有了這個想法,在模運算的世界中,我們也可以嘗試找到 $x$ 使得 $x \times b \equiv a \pmod{m}$。為了做到這一點,我們必須利用費馬小定理。

費馬小定理指出,對於質數 $p$ 和任何整數 $a, (1 \leq a < p)$,$a ^ p \equiv a \pmod{p}$。有了這個,我們也知道 $a ^ {p-1} \equiv 1 \pmod{p}$。現在,為了找到 $x$ 使得 $x \times b \equiv a \pmod{p}$,我們可以證明 $x = a \times b ^ {p-2} \pmod{p}$ 是一個有效的解。

剩下要解決的最後一個問題是如何計算 $b ^ {p-2} \pmod{p}$。天真地進行計算需要 $O(p)$ 時間,這太慢了(在這個問題中,$m$ 可以大到 $10 ^ 9$!)。不過這可以用快速冪的技巧來完成。

這個技巧適用於任何帶有整數指數的一般指數計算。為了計算 $a ^ b$,我們可以計算
$a ^ 0, a ^ 1, a ^ 2, a ^ 4, a ^ 8, \dots, a ^ {2 ^ k}$,其中 $k = \lfloor \log_2 b \rfloor$。然後,由於我們可以將 $b$ 分解為 2 的冪次和,我們可以通過乘以適當的 $a$ 的冪來計算 $a ^ b$。這可以在 $O(\log b)$ 時間內完成。將模運算應用於這個技巧不會改變複雜度。因此,我們可以在 $O(n ^ 3 \log m)$ 時間內解決聯立方程式問題。現在,你能解決它嗎?

Input Format

輸入的第一行包含兩個整數 $n, m$。

接下來的 $n$ 行描述方程式。每行包含 $n+1$ 個整數:前 $n$ 個整數是第 $i$ 個方程的係數 $A_{i,1}, A_{i,2}, \dots, A_{i,n}$,最後一個整數是 $b_i$。每行代表一個方程 $A_{i, 1}x_1 + A_{i, 2}x_2 + \dots + A_{i, n}x_n = b_i$。

  • $1 \leq n \leq 100$
  • $2 \leq m \leq 10 ^ 9$,$m$ 是一個質數。
  • $\forall i, j, 0 \leq A_{i, j} < m$
  • $\forall i, 0 \leq b_i < m$

Output Format

如果該系統有唯一解,在一行上輸出 $n$ 個整數,表示 $x_1, x_2, \ldots, x_n$ 模 $m$ 的值。

如果該系統無解,輸出 $\texttt{NO SOLUTION}$。

如果該系統有多於一個解,輸出 $\texttt{MORE THAN ONE SOLUTION}$。

Sample Input 1

3 998244353
1 1 0 2
0 1 0 1
0 1 2 2

Sample Output 1

1 1 499122177

Sample Input 2

2 7
1 2 3
4 5 6

Sample Output 2

6 2

Sample Input 3

2 5
1 2 3
2 4 2

Sample Output 3

NO SOLUTION

Sample Input 4

3 7
1 2 0 3
2 4 0 6
0 0 1 4

Sample Output 4

MORE THAN ONE SOLUTION

Sample Input 5

1 7
3 5

Sample Output 5

4

Hints

Problem Source

Subtasks

No. Testdata Range Score

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 2097152 65536
1 1000 2097152 65536
2 1000 2097152 65536
3 1000 2097152 65536
4 1000 2097152 65536
5 1000 2097152 65536
6 1000 2097152 65536
7 1000 2097152 65536
8 1000 2097152 65536
9 1000 2097152 65536
10 1000 2097152 65536
11 1000 2097152 65536
12 1000 2097152 65536
13 1000 2097152 65536
14 1000 2097152 65536
15 1000 2097152 65536
16 1000 2097152 65536
17 1000 2097152 65536
18 1000 2097152 65536
19 1000 2097152 65536
20 1000 2097152 65536
21 1000 2097152 65536
22 1000 2097152 65536
23 1000 2097152 65536
24 1000 2097152 65536
25 1000 2097152 65536
26 1000 2097152 65536
27 1000 2097152 65536
28 1000 2097152 65536
29 1000 2097152 65536
30 1000 2097152 65536
31 1000 2097152 65536
32 1000 2097152 65536
33 1000 2097152 65536
34 1000 2097152 65536
35 1000 2097152 65536
36 1000 2097152 65536
37 1000 2097152 65536
38 1000 2097152 65536
39 1000 2097152 65536