超级密码

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. Dll学习三_Dll 相互间以及主程序间的数据共享——测试未通过,应该用内存映射

    测试环境:XP,DELPHI XE 验证通过结构:主程序+一个Dll窗体 共享方式原理:通过主程序与各Dll定义相同的参数结构体,由主程序实例化该结构体,对于各Dll间的共享,通过传主程序实例化的结构 ...

  2. 百度 迷你版 UMeditor富文本编辑器 使用方法

    第一步:下载编辑器 到官网下载 umeditor 最新版源码版本,下载之后打开 _examples/index.html 就可以看到演示例子.[下载页面] 第二步:部署编辑器到页面 解压下载的包,放到 ...

  3. Dapper多表查询(列名重复,类字段重复)映射方案

    1. 一个主名,一个别名,设计时候属性和字段命名不同. 这样主名和别名都可以用的,在主名与别人重复时候用别名(别名可以设计的明确一点长一点,比如类名和字段结合) 2. 或者找一个字段多的直接继承出一个 ...

  4. 命令行工具cmder

    1.下载地址 http://bliker.github.io/cmder/ 分为两个版本:mini版和Full版 2.快捷命令配置: 比如,快速启动canssandra/redis数据库服务和查询工具 ...

  5. 安装使用rspec

    一,安装ruby. 二,运行命令,安装rspec的gem包: gem install rspec 会看到如下的结果: Fetching: rspec-core-2.14.7.gem (100%) Fe ...

  6. C,C++容易被忽略的问题

    1.字符串数组,字符串指针可以直接输出 ]="I am a student"; cout<<s2<<endl; char *p="I am a s ...

  7. hdu1007

    Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some ...

  8. Oracle结果集 (MSSQL存储过程写报表)

    接触SQL Server比较多,写报表是用存储过程实现. 对Oracle实现像MSSQL那样,还是有很多疑问

  9. 部署报表和 ReportViewer 控件 rdlc

    部署报表和 ReportViewer 控件 您可以将报表和 ReportViewer 控件作为应用程序的一部分自由发布.根据控件类型以及报表是配置为本地处理还是远程处理,部署要求会有很大不同.在同一个 ...

  10. OO之工厂模式

    以下为工厂模式的详解,包括简单工厂,普通工厂模式,抽象工厂. 引子: 假设有一个交通工具公司,生产自行车,汽车,飞机等,现要销售该公司的产品,要怎么设计呢? 在交通工具商店中加一个if else判断如 ...