超级密码

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

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
 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
int T , mod , c , n ;
char a[ + ] ;
bool vis[ + ] ;
int num[] ;
struct node
{
int step , ret ;
node () {}
node (int step , int ret) : step (step) , ret (ret) {}
};
struct link
{
int v , nxt ;
}e[ + ];
void echo (int an)
{
int k = ;
for (int i = an ; ~ i ; i = e[i].nxt) {
if (e[i].v < ) a[k ++] = '' + e[i].v ;
else if (e[i].v >= ) a[k ++] = e[i].v - + 'A' ;
}
// printf ("\nk=%d\n" , k) ;
for (int i = k - ; i >= ; i --) {
printf ("%c" , a[i]) ;
}
printf ("\n") ;
} bool bfs ()
{
int E = - ;
std::queue<node> q ;
while (!q.empty ()) q.pop () ;
memset (vis , , sizeof(vis)) ;
node ans , tmp ;
int cnt = E + ;
for (int i = ; i < n ; i ++) {
if (num[i] != && !vis[num[i]%mod]) {
ans = node ( , num[i]%mod) ;
e[cnt].v = num[i] ; e[cnt].nxt = E ; cnt ++ ;
vis[num[i]%mod] ;
if (num[i]%mod == ) {echo (cnt - ) ; return true ;}
q.push (ans) ;
}
}
// for (int i = 0 ; i < n ; i++) printf ("%d " , num[i]) ; printf ("\n") ;
while (!q.empty ()) {
ans = q.front () ; q.pop () ;
E ++ ;
// printf ("step=%d , ret=%d\n" , ans.step , ans.ret) ;
for (int i = ; i < n ; i++) {
tmp.ret = (ans.ret * c + num[i]) % mod ;
tmp.step = ans.step + ;
// printf ("+%d=(%d)\n" , num[i],tmp.ret) ;
if (tmp.step > ) continue ;
if (vis[tmp.ret]) continue ;
e[cnt].v = num[i] ; e[cnt].nxt = E ; cnt ++ ;
// printf ("(%d)ans.ret=%d\n" , num[i] , ans.ret) ;
if (tmp.ret == ) {echo (cnt - ) ; return true ;}
vis[tmp.ret] = ;
q.push (tmp) ;
}
}
return false ;
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
scanf ("%d" , &T) ;
while (T--) {
scanf ("%d%d%d" , &mod , &c , &n) ;
// printf ("mod=%d,c=%d,n=%d\n" , mod , c , n ) ;
// printf ("hehe :%s\n" , a ) ;
for (int i = ; i < n; i++){
scanf("%s", a);
if (a[] <= '' && a[] >= '') num[i] = a[] - '';
else if (a[] <= 'F' && a[] >= 'A') num[i] = a[] - 'A' + ;
}
std::sort (num , num + n) ;
if (mod == ) {
if (num[] == ) puts ("") ;
else puts ("give me the bomb please") ;
continue ;
}
if ( !bfs () ) puts ("give me the bomb please") ;
}
return ;
}

bfs能用来生成数,给赞啊。规避了大数的做法也很6.

hdu.1226.超级密码(bfs)的更多相关文章

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

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

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

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

  3. hdu 1226 超级密码

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

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

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

  5. HDOJ 1226 超级密码(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. & ...

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

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

  7. hdu1226超级密码 bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1226/ 题目大意是:寻找一个五百位之内的C进制密码,该密码是N的正整数倍,而且只能用给定的数构成密码,求这样的密 ...

  8. HDOJ 1226 超级密码

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

  9. 超级密码(bfs)

    超级密码 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

随机推荐

  1. django中migration文件是干啥的

    昨天很蠢的问leader git push的时候会不会把本地的数据库文件上传上去,意思是django中那些migration文件修改之后会不会上传. 然后得知不会,因为所有的数据库都存在本机的mysq ...

  2. 使用dom4j解析XML文档

    dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...

  3. Linux系统被入侵后处理经历

    服务器托管在外地机房. 突然,频繁收到一组服务器ping监控不可达邮件,赶紧登陆zabbix监控系统查看流量状况. 可见流量已经达到了800M左右,肯定不正常,马上尝试SSH登陆系统,不幸的事,这种情 ...

  4. [COCI2012Final]Pro1

    校内OJ上的题. 数据范围非常小,用暴搜就可以,加点剪枝阶乘级别的复杂度竟然可以跑得比$O(N^4)$的算法还要快QAQ. 我用的是Floyd,参考了别人的代码.大概就是先跑个Floyd把点点之间路径 ...

  5. angularjs $q、$http 处理多个异步请求

    angularjs $q.$http 处理多个异步请求 在实际业务中经常需要等待几个请求完成后再进行下一步操作.但angularjs中$http不支持同步的请求. 解决方法一: $http.get(' ...

  6. hibernate----(Hql)另一种查询---利用Criteria类

    package com.etc.test; import java.util.List; import org.hibernate.Criteria;import org.hibernate.Sess ...

  7. CentOS6.5 安装Sphinx 配置MySQL数据源

      前提安装完mysql,并创建测试表和数据 DROP TABLE IF EXISTS `documents`; CREATE TABLE IF NOT EXISTS `documents` ( `i ...

  8. VM安装linux

      看图简单流程即可.注意磁盘空间至少30G,实用oracle数据库时需要更大,可以后期增加.   静待安装完成即可.一定记得创建的用户名及密码,及root用户的密码.

  9. Java 组播

    MulticastSocketServer.java package cn.edu.buaa.multicast; import java.io.IOException; import java.ne ...

  10. [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq

    angularjs 使用ng-repeat报错 <div ng-init="words = ['高校','高校','高校']" ng-repeat="word in ...