在乙個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.in2 3 5
3 4 4
5 6 6
輸出樣例#1:
30 2 3
揹包,用乙個三維陣列存每個點每個值是否會出現,到最後乙個點,出現的情況最多只有k種
**中dp[i][j][l*ma[i][j]%k]=dp[i-1][j][l]||dp[i][j-1][l] 表示從它的左邊或上邊是否會傳下l這個值來
要時刻記得%k,防止炸掉
#includeusingnamespace
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...