zoukankan      html  css  js  c++  java
  • HDOJ 1226 超级密码

    超级密码

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 1492    Accepted Submission(s): 445


    Problem Description
    Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
    密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.

    注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
     
    Input
    输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N<=5000)和C(2<=C<=16),其中N表示的是题目描述中的给定十进制整数,C是密码的进制数.测试数据的第二行是一个整数M(1<=M<=16),它表示构成密码的数字的数量,然后是M个数字用来表示构成密码的数字.两个测试数据之间会有一个空行隔开.

    注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
     
    Output
    对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb please".

    注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
     
    Sample Input
    3
    22 10
    3
    7 0 1

    2 10
    1
    1

    25 16
    3
    A B C
     
    Sample Output
    110
    give me the bomb please
    CCB
    Hint
    Hint
    Huge input, scanf is recommended.
     
    Author
    Ignatius.L
     
    Source
     
    Recommend
    Ignatius.L
     


    r= k (mod c)則 (k*p+a)(mod c)=(r*p+a)(mod c)

    若是某个数&#20540;序列的余数为r.....若是某个余数已经被机关过...那么后面获得的必然是与本来机关过的余数序列雷同的序列 而由BFS的性质.最短的必然是最先被机关出来的..所以.....先到先得!(每一位应用什么数字都是不变的哦.....就是在同一个数&#20540;凑集内...).  若是看不懂 看下面的

    例如 若是 k1%c==k1k2%c   则 k1k3%c==k1k2k3%c

    再特别一点的 比如 3%4==3    27%4==3  则 31%4==271%4 ,32%4==272%4  ,33%4==273%4...............

    我们请求得的数是n的整数倍 即余数为0  则取余数为0的数中的最小的那个即可

    若是请求余数为k的数  只请求出最短的序列 因为n<5000余数最多有5000个  用BFS搜刮 余数第一次呈现的地位就是最短的序列 从中我们找出余数为0对应的最短的序列即可

     结论:只要某种余数曾经呈现过.那么这种余数就不须要再呈现.....  直到找到余数为0   或者长度大于500就退出

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <queue>
      5 
      6 using namespace std;
      7 
      8 const int maxn=505;
      9 const int maxm=5006;
     10 
     11 bool mod[maxm];
     12 char arr[22];
     13 int digit[22];
     14 
     15 
     16 struct Node
     17 {
     18     char str[maxn];
     19     int len;
     20 }ans;
     21 
     22 int N,C,M;
     23 
     24 int judge(Node X)
     25 {
     26     int sum=0;
     27     int len=X.len;
     28     int OK=0;
     29     for(int i=0;i<len;i++)
     30     {
     31         if(X.str[i]!='0')
     32         {
     33             OK=1;
     34             break;
     35         }
     36     }
     37     if(!OK)  return 5005;
     38     for(int i=0;i<len;i++)
     39     {
     40         if(X.str[i]>='0'&&X.str[i]<='9')
     41         {
     42          sum=(sum*C+(X.str[i]-'0'))%N;
     43         }
     44         else if(X.str[i]>='A'&&X.str[i]<='F')
     45         {
     46             sum=(sum*C+(X.str[i]-'A'+10))%N;
     47         }
     48     }
     49     sum=sum%N;
     50     return sum;
     51 }
     52 
     53 queue<Node> q;
     54 
     55 int bfs()
     56 {
     57 
     58     Node x,y;
     59 
     60     while(!q.empty())
     61     {
     62 
     63         y=q.front();
     64         q.pop();
     65         int MOD1;
     66 
     67       //  if(y.len==3&&y.str[0]=='1'&&y.str[1]=='1'&&y.str[0]=='0')  cout<<"miaomiaoishere
    ";
     68 
     69         if((MOD1=judge(y))==0)
     70         {
     71             ans=y;
     72             int len=ans.len;
     73             for(int i=0;i<len;i++)
     74                 printf("%c",ans.str[i]);
     75             putchar(10);
     76             return 1;
     77         }
     78         int zero=0;
     79 //        if(y.len==1) zero=1;
     80         for(int i=zero;i<16;i++)
     81         {
     82             if(digit[i])
     83             {
     84                 x=y;
     85                 if(i>=0&&i<10)
     86                   x.str[x.len]=i+'0';
     87                 else if(i>=10&&i<=15)
     88                   x.str[x.len]=i-10+'A';
     89                 x.len=x.len+1;
     90                 int MOD2=judge(x);
     91                 if(x.len+1<=500&&mod[MOD2]==false&&MOD2!=5005)
     92                 {
     93                     mod[MOD2]=true;
     94                     q.push(x);
     95                 }
     96             }
     97         }
     98     }
     99     return 0;
    100 }
    101 
    102 int main()
    103 {int T;
    104 scanf("%d",&T);
    105 while(T--)
    106 {
    107     memset(mod,false,sizeof(mod));
    108     memset(digit,0,sizeof(digit));
    109     while(!q.empty())  q.pop();
    110 
    111     scanf("%d%d%d",&N,&C,&M);
    112     getchar();
    113     for(int i=0;i<M;i++)
    114     {
    115        scanf("%c",&arr[i]);
    116        getchar();
    117        if(arr[i]<='9'&&arr[i]>='0')
    118          digit[arr[i]-'0']=1;
    119        else if(arr[i]<='F'&&arr[i]>='A')
    120         digit[arr[i]-'A'+10]=1;
    121     }
    122     Node xt;
    123     for(int i=0;i<=16;i++)
    124     {
    125         if(digit[i])
    126         {
    127             if(i>=0&&i<10)
    128               xt.str[0]=i+'0';
    129             else if(i>=10&&i<=15)
    130               xt.str[0]=i-10+'A';
    131             xt.len=1;
    132             q.push(xt);
    133   //          int MOD=judge(xt);
    134   //          mod[MOD]=true;
    135         }
    136     }
    137   //  cout<<q.size()<<"----------
    ";
    138   //  getchar();
    139 
    140     if(N==0)
    141     {
    142         if(digit[0]) puts("0");
    143         else  puts("give me the bomb please");
    144     }
    145     else
    146     {
    147         if(bfs())
    148         {
    149         }
    150         else
    151         puts("give me the bomb please");
    152     }
    153 
    154 }
    155 
    156     return 0;
    157 }
  • 相关阅读:
    树莓派 无线网卡配置
    树莓派.Net MVC4 Mono4 Jexus
    springcloud超简单的入门3--负载均衡
    springcloud超简单的入门2--Eureka服务治理
    SpringCloud超简单的入门(1)--一些简单的介绍
    Tomcat9控制台中文乱码的解决方案
    win10 调整音量时 左上角弹框 的解决办法
    .NETCore 添加Docker支持,并上传镜像至Docker Hub,最后在CentOs中拉取镜像运行
    假设每台交换机上行有N条线,两跳内,可以最多让多少个交换机互通?
    .netcore微服务-SkyWalking安装部署IIS
  • 原文地址:https://www.cnblogs.com/CKboss/p/3151328.html
Copyright © 2011-2022 走看看