• P2049 魔术棋子


    题目描述

    在一个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: 复制
    2 3 5
    3 4 4
    5 6 6
    
    输出样例#1: 复制
    3
    0 2 3

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define inf 2147483647
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    #define ri register int
    template <class T> inline T min(T a, T b, T c)
    {
        return min(min(a, b), c);
    }
    template <class T> inline T max(T a, T b, T c)
    {
        return max(max(a, b), c);
    }
    template <class T> inline T min(T a, T b, T c, T d)
    {
        return min(min(a, b), min(c, d));
    }
    template <class T> inline T max(T a, T b, T c, T d)
    {
        return max(max(a, b), max(c, d));
    }
    #define pi acos(-1)
    #define me(x, y) memset(x, y, sizeof(x));
    #define For(i, a, b) for (int i = a; i <= b; i++)
    #define FFor(i, a, b) for (int i = a; i >= b; i--)
    #define mp make_pair
    #define pb push_back
    const int maxn = 100005;
    // name*******************************
    bool f[105][105][105];
    int n,m;
    int K;
    int a[105][105];
    int ans=0;
    // function******************************
    
    //***************************************
    int main()
    {
        cin>>n>>m>>K;
        For(i,1,n)
        {
            For(j,1,m)
            {
                cin>>a[i][j];
                For(k,0,K-1)
                f[i][j][k]=0;
            }
        }
        f[1][1][a[1][1]%K]=1;
        For(i,1,n)
        {
            For(j,1,m)
            {
                For(k,0,K)
                {
                    f[i+1][j][k*a[i+1][j]%K]|=f[i][j][k];
                    f[i][j+1][k*a[i][j+1]%K]|=f[i][j][k];
                }
            }
        }
        For(i,0,K-1)
        {
            if(f[n][m][i])ans++;
        }
        cout<<ans<<endl;
         For(i,0,K-1)
        {
            if(f[n][m][i])cout<<i<<" ";
        }
    
        return 0;
    }
  • 相关阅读:
    计算两张图的余弦相似度
    绘制heatmap
    TensorFlow图像识别(物体分类)入门教程
    毕业设计任务01-前期调查与选题
    个人附加作业
    个人作业3——个人总结(Alpha阶段)
    结对编程2——单元测试
    个人作业2——英语学习APP案例分析
    结对作业1----基于GUI的四则运算生成器
    个人作业1——四则运算题目生成程序
  • 原文地址:https://www.cnblogs.com/planche/p/8650452.html
Copyright © 2020-2023  润新知