超级密码

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就退出

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue> using namespace std; const int maxn=;
const int maxm=; bool mod[maxm];
char arr[];
int digit[]; struct Node
{
char str[maxn];
int len;
}ans; int N,C,M; int judge(Node X)
{
int sum=;
int len=X.len;
int OK=;
for(int i=;i<len;i++)
{
if(X.str[i]!='')
{
OK=;
break;
}
}
if(!OK) return ;
for(int i=;i<len;i++)
{
if(X.str[i]>=''&&X.str[i]<='')
{
sum=(sum*C+(X.str[i]-''))%N;
}
else if(X.str[i]>='A'&&X.str[i]<='F')
{
sum=(sum*C+(X.str[i]-'A'+))%N;
}
}
sum=sum%N;
return sum;
} queue<Node> q; int bfs()
{ Node x,y; while(!q.empty())
{ y=q.front();
q.pop();
int MOD1; // if(y.len==3&&y.str[0]=='1'&&y.str[1]=='1'&&y.str[0]=='0') cout<<"miaomiaoishere\n"; if((MOD1=judge(y))==)
{
ans=y;
int len=ans.len;
for(int i=;i<len;i++)
printf("%c",ans.str[i]);
putchar();
return ;
}
int zero=;
// if(y.len==1) zero=1;
for(int i=zero;i<;i++)
{
if(digit[i])
{
x=y;
if(i>=&&i<)
x.str[x.len]=i+'';
else if(i>=&&i<=)
x.str[x.len]=i-+'A';
x.len=x.len+;
int MOD2=judge(x);
if(x.len+<=&&mod[MOD2]==false&&MOD2!=)
{
mod[MOD2]=true;
q.push(x);
}
}
}
}
return ;
} int main()
{int T;
scanf("%d",&T);
while(T--)
{
memset(mod,false,sizeof(mod));
memset(digit,,sizeof(digit));
while(!q.empty()) q.pop(); scanf("%d%d%d",&N,&C,&M);
getchar();
for(int i=;i<M;i++)
{
scanf("%c",&arr[i]);
getchar();
if(arr[i]<=''&&arr[i]>='')
digit[arr[i]-'']=;
else if(arr[i]<='F'&&arr[i]>='A')
digit[arr[i]-'A'+]=;
}
Node xt;
for(int i=;i<=;i++)
{
if(digit[i])
{
if(i>=&&i<)
xt.str[]=i+'';
else if(i>=&&i<=)
xt.str[]=i-+'A';
xt.len=;
q.push(xt);
// int MOD=judge(xt);
// mod[MOD]=true;
}
}
// cout<<q.size()<<"----------\n";
// getchar(); if(N==)
{
if(digit[]) puts("");
else puts("give me the bomb please");
}
else
{
if(bfs())
{
}
else
puts("give me the bomb please");
} } return ;
}

HDOJ 1226 超级密码的更多相关文章

  1. HDOJ 1226 超级密码(bfs)

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

  2. hdoj 1226 超级password 【隐图BFS】

    称号:hdoj 1226 超级password 分析:这题属于隐式图搜索,状态不是非常明显,须要自己建立. 事实上搜索说白了就是暴力. 这个题目就是,首先对给出的能够组成的全部的数依次枚举.长度从小到 ...

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

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

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

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

  5. hdu 1226 超级密码

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

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

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

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

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

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

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

  9. 中兴F412光猫超级密码破解、破解用户限制、关闭远程控制、恢复路由器拨号

    不少家庭都改了光纤入户,那肯定少不了光猫的吧.今天以中兴F412光猫为例介绍下此型号光猫超级密码的破解方法.一.F412超级密码破解方法1.运行CMD,输入telnet 192.168.1.1: 2. ...

随机推荐

  1. C#从数据库读取数据到DataSet并保存到xml文件

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.IO; pub ...

  2. VM虚拟机无法拖拽、粘贴、复制

    VM无法从客户机拖放/复制文件到虚拟机的解决办法: 将这两项取消勾选,点击[确定].再次打开,勾选,点击[确定] 原因分析:可能是VM中默认是不支持该功能的,但是在配置窗体上确实默认打钩打上的. 依据 ...

  3. IS上部署MVC网站,打开后ExtensionlessUrlHandler-

    以管理员运行下面的命令注册: 32位机器: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 64位机器: C:\W ...

  4. Show or Hide Menu List via ng-show

    <div ng-app ng-controller='MenuController'> <ul ng-show='menuState_show'> <li>Stun ...

  5. R语言的日期运算

    写hive SQL查询, 需要从导入的参数, 自动累加日期. 从而实现一个自动的,多个日期的统计过程 R语言的日期运算超级简单. > test<-Sys.Date() > test ...

  6. 第十五章 调试及安全性(In .net4.5) 之 管理程序集

    1. 概述 本章将介绍 什么是程序集.如何强命名程序集.如何把程序集放入GAC.程序集版本 以及 WinMD程序集. 2. 主要内容 2.1 什么是程序集 程序集(Assembly)概念的出现,是为了 ...

  7. MVC中的奇葩错误,参数转对象

    在使用MVC中遇到一个神奇的错误,特此记录(我在用MVC4时遇到) 上面两张图就是一个变量名进行了修改,其他不变!form里面的参数也是一样的!喜欢尝试的可以尝试一下! 我的变量使用action时出现 ...

  8. Server Tomcat v7.0 Server at localhost failed to start解决办法

    今晚搞了下tomcat,在调试的时候发现报了这样一个错误Server Tomcat v7.0 Server at localhost failed to start 首先,确认了端口号8080是不是被 ...

  9. Python生成器以及yield语句

    生成器是一种暂缓求值的技术,它可以用来生成一系列的值,但不会一次性生成所有的值,而只在需要的时候才计算和生成一个值. 通过yield语句构建生成器 要得到一个生成器,我们需要定义一个函数,这个函数返回 ...

  10. python的http请求应用--每日签到

    写点python吧,python其实是个很好用的工具,作为浇水语言,跟其他语言联系也很紧密,想用什么包直接import,导入ctypes调用底层函数库,导入web相关的包可以轻松写爬虫,今天我们写的跟 ...