• 【noip模拟赛8】魔术棋子


    描述

     

    在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数。一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几?

    如以下2*3棋盘:

    344
    566

    棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432540。所以当K=5时,可求得最后的结果为:0,2,3

    输入

     

    输入第一行为三个数,分别为M,N,K (1≤M,N,K≤ 100)

    以下M行,每行N个数,分别为此方阵中的数。

    输出

     

    输出第一行为可能的结果个数 第二行为所有可能的结果(按升序输出)

    输入样例 1 

    2 3 5
    3 4 4
    5 6 6

    输出样例 1

    3
    0 2 3

    一开始用dfs 直接爆了!!!!,,
    用二维vector来dp即可
    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define pb push_back
    #define fi first
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    ///////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 100+5
    
    vector<int>dp[N][N];
    int mp[N][N];
    
    int main()
    {
        int n,m,mod;
        RIII(n,m,mod);
        rep(i,1,n)
        rep(j,1,m)
        RI(mp[i][j]);
        dp[1][1].pb( mp[1][1]%mod );
    
        rep(i,1,n)
        rep(j,1,m)
        {
            if(dp[i-1][j].size())
            rep(k,0,dp[i-1][j].size()-1)
            {
                int x=(dp[i-1][j][k]*mp[i][j])%mod;
                if(find(dp[i][j].begin(),dp[i][j].end(),x)==dp[i][j].end())
                    dp[i][j].pb(x);
            }
            if(dp[i][j-1].size())
            rep(k,0,dp[i][j-1].size()-1)
            {
                int x=(dp[i][j-1][k]*mp[i][j])%mod;
        
                if(find(dp[i][j].begin(),dp[i][j].end(),x)==dp[i][j].end())
                    dp[i][j].pb(x);
            }
        }
        sort(dp[n][m].begin(),dp[n][m].end());
        printf("%d
    ",dp[n][m].size());
        rep(i,0,dp[n][m].size()-1)
        {
            if(i!=0)printf(" ");
            printf("%d",dp[n][m][i]);
        }
        return 0;
    }




  • 相关阅读:
    Android测试工具 UIAutomator入门与介绍
    C#异步编程
    懒得找,存个笔记:easyui combogrid 下拉+关键字搜索
    mssql replace
    序列化类型为XX的对象时检测到循环引用
    shell脚本运行python命令
    python技巧
    边缘检测测评标准
    mybatis 手动生成可执行sql
    Linux如何扩容物理文件系统分区
  • 原文地址:https://www.cnblogs.com/bxd123/p/10602839.html
Copyright © 2020-2023  润新知