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

Huge input, scanf is recommended.

思路:

先将题目给的m个字符进行标记,先进行第一轮循环,看看是否有个位数直接是n的倍数(0除外,因为题目规定最高位不能为0)再开始进队列,进行广搜。

需要注意的细节:
1、输入用%s输入单个字符,因为存在空格,%s不接收空格,%c会接收空格

2、大数取模公式:(a+b)%m=(a%m+b%m)%m

例如:175%6 =(100+70+5)%6 =100%6+70%6+5%6 =(100%6+70%6+5%6)%6;

  1. int sum=;
  2. for(int i=;i<na.len;i++)
  3. sum=(sum*+a[i]-'')%n;
  4. return sum;

a%m=a%m%m,多取几次模对低位是没有影响的。

该题:

  1. int sum=;
  2. for(int i=; i<p.l; i++)//p.l密码的长度
  3. {
  4. sum=(sum*c+p.str[i])%n;//c是几进制
  5. }
  6. return sum;

3、队列基本操作:

back()返回最后一个元素

empty()如果队列空则返回真

front()返回第一个元素

pop()删除第一个元素

push()在末尾加入一个元素

size()返回队列中元素的个数

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. char mm[];
  8. int book[],out[],n,c,m;
  9. int flag;
  10. struct node
  11. {
  12. int str[];//存密码
  13. int l;//密码长度
  14. } p,q;
  15. void shuchu(node p)
  16. {
  17. for(int i=; i<p.l; i++)
  18. {
  19. if(p.str[i]<=)
  20. printf("%d",p.str[i]);
  21. else
  22. printf("%c",p.str[i]+);
  23. }
  24. flag=;
  25. printf("\n");
  26. return ;
  27. }
  28.  
  29. int quyu(node p)
  30. {
  31. // int sum=p.str[p.l-1];
  32. // for(int i=p.l-2; i>=0; i--)
  33. // {
  34. // sum=(sum+(p.str[i]*c)%n)%n;
  35. // c=c*c;
  36. // }
  37. // return sum;
  38. int sum=;
  39. for(int i=; i<p.l; i++)
  40. {
  41. sum=(sum*c+p.str[i])%n;
  42. }
  43. return sum;
  44. }
  45. void bfs()
  46. {
  47. memset(out,,sizeof(out));//标记余数
  48. queue<node>Q;
  49. p.l=;
  50. int yushu;
  51. for(int i=; i<; i++) //先走第一遍,让系统给的mm里面的每一个元素作为队头,因为可能第一遍给的数据就是最小倍数
  52. //因为0不能作为开头,所以走第一遍的时候遍历从1开始;
  53. {
  54. if(book[i]==)//如果题目给了该数字
  55. {
  56. p.str[]=i;//后面的不断覆盖前面的,因为刚开始第一步只有一步
  57. p.l=;//进来一个元素,长度改变为1,因为不断覆盖且只进行第一步,所以长度始终为1,不需要++
  58. yushu=quyu(p);
  59. if(yushu==)//说明找到了
  60. {
  61. shuchu(p);
  62. flag=;
  63. break;
  64. }
  65. else
  66. {
  67. //第一遍遍历没有找到,且如果这个余数之前没有出现过的话,把该余数标记一下
  68. if(out[yushu]==)
  69. {
  70. out[yushu]=;
  71. Q.push(p);//在队尾加入一个元素
  72. }
  73. }
  74. //printf("%d--",flag);
  75. }
  76. }
  77. while(!Q.empty())
  78. {
  79.  
  80. if(flag)
  81. break;
  82. //node p;
  83. p=Q.front();//返回到第一个元素
  84. Q.pop();//删除第一个元素
  85. for(int i=; i<; i++) //接着一条条队列开始进行搜索
  86. {
  87. if(book[i]==)//如果是题目给定的那几个数字就往下进行
  88. {
  89. //printf("%d-- ",i);
  90. p.str[p.l]=i;//之前第一遍遍历的时候存的位置是l=0的位置,后来l变成1了,所以这里不需要++,直接占用l=1的位置
  91. //之后再++,给下一位存入的数字留一个位置
  92. p.l++;
  93. yushu=quyu(p);
  94. if(yushu==)//找到了
  95. {
  96. shuchu(p);
  97. flag=;
  98. break;
  99. }
  100. else
  101. {
  102. //if(out[yushu]==0&&(a.l-1<=497))//注意一下长度需要控制,并且是从l=0开始存的
  103. if(out[yushu]==&&(p.l<=))
  104. {
  105. out[yushu]=;
  106. Q.push(p);
  107. }
  108. p.l--;//这步很重要,非常重要
  109. }
  110. }
  111. }
  112. }
  113. return ;
  114. }
  115. int main()
  116. {
  117. int t;
  118. while(~scanf("%d",&t)&&t)
  119. {
  120. while(t--)
  121. {
  122. flag=;
  123. memset(book,,sizeof(book));
  124. scanf("%d %d",&n,&c);
  125. scanf("%d",&m);
  126. // for(int i=0; i<m; i++)
  127. // {
  128. // scanf("%c",&mm[i]);
  129. // if(mm[i]>='0'&&mm[i]<='9')
  130. // book[mm[0]-48]=1;
  131. // if(mm[i]>='A'&&mm[i]<='F')
  132. // //book[mm[i]-65+10]=1;
  133. // book[mm[i]-55]=1;
  134. // }//注意一下这里的输入,不能用%c,因为它接收空格,一开始记错了
  135. for(int i=; i<m; i++)
  136. {
  137. scanf("%s",mm);
  138. if(mm[]>=''&&mm[]<='')
  139. book[mm[]-]=;
  140. if(mm[]>='A'&&mm[]<='F')
  141. //book[mm[i]-65+10]=1;
  142. book[mm[]-]=;
  143. }
  144. if(n==)
  145. {
  146. if(book[]==)//说明给的几个数中没有0,该密码无法构成,故不存在
  147. printf("give me the bomb please\n");
  148. if(book[]==)//说明给的几个数中有0,该密码最小倍数为0
  149. printf("0\n");
  150. }
  151. else
  152. {
  153. bfs();
  154. if(flag==)//return为0,说明没有找到密码,不然就在上面输出了(return为1)
  155. printf("give me the bomb please\n");
  156. }
  157. }
  158. }
  159. return ;
  160. }

HDU-1226-超级密码-队列+广搜+大数取模的更多相关文章

  1. HDU 1226 超级密码(数学 bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others)    ...

  2. hdu.1226.超级密码(bfs)

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. hdu 1226 超级密码

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  4. HDU 1226 超级密码(BFS) (还需研究)

    Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Desc ...

  5. HDU 1226 超级密码 (搜素)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1226 题意简单,本来是一道很简单的搜素题目. 但是有两个bug: 1.M个整数可能有重复的. 2.N可 ...

  6. hdu 1226 超级密码(bfs+余数判重)

    题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上.  首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...

  7. 【HDU 5832】A water problem(大数取模)

    1千万长度的数对73和137取模.(两个数有点像,不要写错了) 效率要高的话,每15位取一次模,因为取模后可能有3位,因此用ll就最多15位取一次. 一位一位取模也可以,但是比较慢,取模运算是个耗时的 ...

  8. 题解报告:hdu 1212 Big Number(大数取模+同余定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1212 Problem Description As we know, Big Number is al ...

  9. hdu2302(枚举,大数取模)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2303 题意:给出两个数k, l(4<= k <= 1e100, 2<=l<=1 ...

随机推荐

  1. 前缀和+排序——cf1043E

    先不考虑第二个条件 要求i和所有其他人的分数和最小,选择x还是y,可以推出一个公式,即差xi-yi小的j都选y,反之都选x 那么按照xi-yi排序即可 然后再考虑第二个条件,做减法就行 /* xi+y ...

  2. Python每日一题 001

    Github地址:https://github.com/Yixiaohan/show-me-the-code Talk is Cheap, show me the code. --Linus Torv ...

  3. PHP中关于Phar的学习

    什么是phar 一个PHP程序往往是由多个文件组成的,如果能够集中为一个文件来分发和运行是很方便的.phar便应运而生.大概跟java的jar文件是差不多类似的.但是php的phar文件是可以由php ...

  4. 使用PHP和MySQL添加数据库时的小错误及注意事项总结

    刚刚开始使用PHP和MySQL搭配着,从前端往数据库传数据,错误犯了不少,总结一下,提醒自己 1.写MySQL语句时,标点符号使用错 正确的应该是 $sql = "INSERT INTO ` ...

  5. “今日头条杯”首届湖北省大学程序设计竞赛--F. Flower Road

    题目链接:点这 github链接:(包含数据和代码,题解):点这 链接:https://www.nowcoder.com/acm/contest/104/E来源:牛客网 题目描述 (受限于评测机,此题 ...

  6. nteract 使用教程

    安装 直接去官网下载 一路回车 官网 建立python虚拟环境 和我们平时一样 不同的是在建立完之后 要安装一个kernel Using Python3 with pip and a virtual ...

  7. Dijkstra Algorithm 迪克特斯拉算法--Python

    迪克斯拉特算法: 1.找出代价最小的节点,即可在最短时间内到达的节点: 2.更新节点的邻居的开销: 3.重复这个过程,直到图中的每个节点都这样做了: 4.计算最终路径. ''' 迪克斯特拉算法: 1. ...

  8. f-li.cn

    package org.rx.service.command.impl; import lombok.Getter; import lombok.Setter; import org.rx.core. ...

  9. HIve分组查询返回每组的一条记录

    select a.lng,a.lat from (select row_number() over ( partition by uid,grid_id) as rnum,weighted_centr ...

  10. python正则re

    import reline = "Catsaresmarterthandogs"matchObj = re.match( r'(.*)are(\w{2})(.*)', line, ...