洛谷 P2049 魔术棋子
2024-08-25 20:34:47
题目描述
在一个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<<" ";
}
最新文章
- SQL Server中的事物
- css2--collapse
- 读《编写可维护的javascript》笔记
- 关于windows字体的一些笔记
- (转)【ASP.NET Web API】Authentication with OWIN
- Codeforces 13C Sequence --DP+离散化
- 安装PL/SQL Developer 遇到的问题及解决方法
- 前端编码规范(2)—— HTML 规范
- mongoose深层修改问题
- AngularJs在单击提交后显示验证信息.
- ActionScript 3.0日期与时间管理(Date类)
- Hibernate 一对多单向关联Demo
- debian安装jdk8
- SDWebImage源码解读之分类
- javascript 类数组对象
- Treap-平衡树学习笔记
- springboot与Mybatis结合
- Eclipse常用快捷键--摘录他人
- CentOS 6.5 64位 安装Nginx, MySQL, PHP
- orm查询语法参考文章
热门文章
- leetcode小题解析
- java EE使用response返回中文时,出现乱码问题
- 中山纪念中学培训杂题(难的都不在这里面qwq)
- C#窗体间的跳转传值
- Spring MVC学习总结(7)——Spring MVC整合Ehcache缓存框架
- 监控SQLserver计数器
- Spring Cloud Feign 出现ClassNotFoundException: feign.Feign$Builder错误
- HBase基本数据操作具体解释
- hdoj--1384--Intervals(差分约束)
- zzulioj--1711--漂洋过海来看你(dfs+vector)