题目描述

在一个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
思路:dp
f[i][j][k]表示到i,j时,模数可否为k。
正确性可以由 (a*b)%mod=(a%mod)*(b%mod)得到。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,mod,ans;
int map[][];
int f[][][];
int main(){
scanf("%d%d%d",&n,&m,&mod);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&map[i][j]);
f[][][map[][]%mod]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<mod;k++){
if(f[i-][j][k]) f[i][j][k*map[i][j]%mod]=;
if(f[i][j-][k]) f[i][j][k*map[i][j]%mod]=;
}
for(int i=;i<mod;i++)
if(f[n][m][i]) ans++;
cout<<ans<<endl;
for(int i=;i<mod;i++)
if(f[n][m][i]) cout<<i<<" ";
}

最新文章

  1. SQL Server中的事物
  2. css2--collapse
  3. 读《编写可维护的javascript》笔记
  4. 关于windows字体的一些笔记
  5. (转)【ASP.NET Web API】Authentication with OWIN
  6. Codeforces 13C Sequence --DP+离散化
  7. 安装PL/SQL Developer 遇到的问题及解决方法
  8. 前端编码规范(2)—— HTML 规范
  9. mongoose深层修改问题
  10. AngularJs在单击提交后显示验证信息.
  11. ActionScript 3.0日期与时间管理(Date类)
  12. Hibernate 一对多单向关联Demo
  13. debian安装jdk8
  14. SDWebImage源码解读之分类
  15. javascript 类数组对象
  16. Treap-平衡树学习笔记
  17. springboot与Mybatis结合
  18. Eclipse常用快捷键--摘录他人
  19. CentOS 6.5 64位 安装Nginx, MySQL, PHP
  20. orm查询语法参考文章

热门文章

  1. leetcode小题解析
  2. java EE使用response返回中文时,出现乱码问题
  3. 中山纪念中学培训杂题(难的都不在这里面qwq)
  4. C#窗体间的跳转传值
  5. Spring MVC学习总结(7)——Spring MVC整合Ehcache缓存框架
  6. 监控SQLserver计数器
  7. Spring Cloud Feign 出现ClassNotFoundException: feign.Feign$Builder错误
  8. HBase基本数据操作具体解释
  9. hdoj--1384--Intervals(差分约束)
  10. zzulioj--1711--漂洋过海来看你(dfs+vector)