洛谷 P2049 魔術棋子

2021-10-04 06:06:44 字數 798 閱讀 2497

乙個比較簡單dp問題。

我們先來分析一下題目,要找到所有的模的總數,首先可以想到,用dp[i][j]表示在(i,j)這個點所有的方案數。但是,這樣顯然不行。因為僅僅知道方案總數對求解下乙個狀態毫無幫助。那麼,我們就要記錄每乙個點所有可能的模。所以,我們用三維dp[i][j][l]表示在(i,j)點是否能夠得到模l。即有狀態轉移方程:

dp[i][j][l * num[i][j] % k]=dp[i][j - 1][l] || dp[i - 1][j][l]。

**如下:

#include

using

namespace std;

intmain()

; cin >> m >> n >> k;

for(

int i =

1; i <= m; i++)}

dp[1]

[1][num[1]

[1]]

=1;for

(int i =

1; i <= m; i++)}

}for

(int i =

0; i < k; i++

) ans +

= dp[m]

[n][i]

; cout << ans << endl;

for(

int i =

0; i < k; i++)if

(dp[m]

[n][i]

) cout << i <<

" ";

return0;

}

洛谷 P2049 魔術棋子

在乙個m n的魔術棋盤中,每個格仔中均有乙個整數,當棋子走進這個格仔中,則此棋子上的數會被乘以此格仔中的數。乙個棋子從左上角走到右下角,只能向右或向下行動,請問此棋子走到右下角後,模 mod k可以為幾?如以下2 3棋盤 3 4 4 5 6 6 棋子初始數為1,開始從左上角進入棋盤,走到右下角,上圖...

洛谷 P2049 魔術棋子

在乙個m n的魔術棋盤中,每個格仔中均有乙個整數,當棋子走進這個格仔中,則此棋子上的數會被乘以此格仔中的數。乙個棋子從左上角走到右下角,只能向右或向下行動,請問此棋子走到右下角後,模 mod k可以為幾?如以下2 3棋盤 3 4 4 5 6 6 棋子初始數為1,開始從左上角進入棋盤,走到右下角,上圖...

洛谷 P2049 魔術棋子 vector

用乙個vector維護每乙個點都可以乘出哪些數來,然後將 n,m 的所有數從小到大輸出即可.要用乙個bool ff j k 來維護當前這個點 i,j 裡面有沒有被放過k,以此保證vector是個集合,不然會mle 壓維也不行 1 include2 include3 include4 include5...