乙個比較簡單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...