魔术棋子(记忆化搜索)
#include<iostream> using namespace std; int n,m,k,ans; int map[110][110]; int vis[110][110][110]; int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>map[i][j]; } } vis[1][1][map[1][1]%k]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int x=0;x<k;x++) { if(vis[i-1][j][x]!=0) { vis[i][j][x*map[i][j]%k]=1; } if(vis[i][j-1][x]!=0) { vis[i][j][x*map[i][j]%k]=1; } } } } for(int i=0;i<k;i++) { if(vis[n][m][i]!=0) { ans++; } } cout<<ans<<endl; for(int i=0;i<k;i++) { if(vis[n][m][i]!=0) { cout<<i<<" "; } } return 0; }