在乙個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
思路:dp
f[i][j][k]表示到i,j時,模數可否為k。
正確性可以由 (a*b)%mod=(a%mod)*(b%mod)得到。
#include#include#include
#include
using
namespace
std;
intn,m,mod,ans;
int map[101][101
];int f[101][101][101
];int
main()
for(int i=0;i)
if(f[n][m][i]) ans++;
cout
for(int i=0;i)
if(f[n][m][i]) cout<"";
}
洛谷 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...