洛谷 P2049 魔術棋子

2022-05-15 09:21:59 字數 1230 閱讀 2909

在乙個m*n的魔術棋盤中,每個格仔中均有乙個整數,當棋子走進這個格仔中,則此棋子上的數會被乘以此格仔中的數。乙個棋子從左上角走到右下角,只能向右或向下行動,請問此棋子走到右下角後,模(mod)k可以為幾?

如以下2*3棋盤:

3 4 4

5 6 6

棋子初始數為1,開始從左上角進入棋盤,走到右下角,上圖中,最後棋子上的數可能為288,432或540。所以當k = 5時,可求得最後的結果為:0,2,3。

輸入格式:

輸入檔案magic.in第一行為三個數,分別為m,n,k (1 ≤ m,n,k ≤ 100)以下m行,每行n個數,分別為此方陣中的數。

輸出格式:

輸出檔案magic.out第一行為可能的結果個數

第二行為所有可能的結果(按公升序輸出)

輸入樣例#1:

magic.in

2 3 5

3 4 4

5 6 6

輸出樣例#1:

3

0 2 3

揹包,用乙個三維陣列存每個點每個值是否會出現,到最後乙個點,出現的情況最多只有k種

**中dp[i][j][l*ma[i][j]%k]=dp[i-1][j][l]||dp[i][j-1][l] 表示從它的左邊或上邊是否會傳下l這個值來

要時刻記得%k,防止炸掉

#includeusing

namespace

std;

int n,m,k,dp[101][101][101],ma[2333][2333],res[10000000

],num;

intmain()

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

for(int l=0;l)

if(!dp[i][j][l*ma[i][j]%k])

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

][l];

for(int i=0;iif(dp[n][m][i]) num++;

printf(

"%d\n

",num);

for(int i=0;iif(dp[n][m][i]) printf("

%d "

,i);

return0;

}

洛谷 P2049 魔術棋子

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

洛谷 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...