您的位置:首页 > 其它

HDU 1226 - 超级密码

2014-06-27 16:27 363 查看

超级密码

Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 2242 Accepted Submission(s): 711



[align=left]Problem Description[/align]
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:

密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.

注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.

[align=left]Input[/align]
输入数据的第一行是一个整数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.我保证输入数据都是合法的.

[align=left]Output[/align]
对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb please".

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

[align=left]Sample Input[/align]

3
22 10
3
7 0 1

2 10
1
1

25 16
3
A B C


[align=left]Sample Output[/align]

110
give me the bomb please
CCB

HintHint
Huge input, scanf is recommended.


[align=left]Author[/align]
Ignatius.L

[align=left]Source[/align]
杭州电子科技大学第三届程序设计大赛

[align=left]Recommend[/align]
Ignatius.L | We have carefully selected several similar problems for you: 1180 1043 1026 1016 1044

思路:利用给出的数组成一个最小的串,使得这个串mod n == 0

原理 k = x % n = y % n 由xy拓展(在xy后面添加数字)出来数%n是一样的

比如 17 % 7 == 10 % 7 == 3 则由17/10相同方式拓展出来的数mod n一样 

例如 

1721 % 7 == 1021 % 7 == 6

103443 % 7 == 173443 % 7 == 4

直接BFS,利用余数判重

遇到的问题:

这道题WA到爆 然后找标程对拍,用python写数据生成器 py范围异常 才发现我的16进制是0-E!!!

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#include <queue>
#include <set>

using namespace std;

//#define WIN
#ifdef WIN
typedef __int64 LL;
#define iform "%I64d"
#define oform "%I64d\n"
#define oform1 "%I64d"
#else
typedef long long LL;
#define iform "%lld"
#define oform "%lld\n"
#define oform1 "%lld"
#endif

#define S64I(a) scanf(iform, &(a))
#define P64I(a) printf(oform, (a))
#define S64I1(a) scanf(iform1, &(a))
#define P64I1(a) printf(oform1, (a))
#define FOR(i, s, t) for(int (i)=(s); (i)<(t); (i)++)

const int INF = 0x3f3f3f3f;
const double eps = 10e-9;
const double PI = (4.0*atan(1.0));

const int maxn = 5000 + 20;
const int maxm = 16+2;
int n, c, m;
char A[maxm];
int vis[maxn];

int c2i(char c) {
if('0' <= c && c <= '9') return c - '0';
if('A' <= c && c <= 'F') return c - 'A' + 10;
}

char i2c(int x) {
if(0 <= x && x <= 9) return x + '0';
if(10 <= x && x <= 15) return x - 10 + 'A';
}

struct Node {
string x;
int mod;
Node(string _x="", int _mod=0) {
x = _x;
mod = _mod;
}
};

queue<Node> Q;
int bfs(string & ans) {
int res = 0;
memset(vis, 0, sizeof(vis));
while(!Q.empty()) Q.pop();
for(int i=0; i<m; i++) if(A[i] != '0') {
string sx = "";
sx += A[i];
Q.push(Node(sx, c2i(A[i])%n));
vis[c2i(A[i])%n] = 1;
}
//int ttt = 0;
while(!Q.empty()) {
Node cur = Q.front();
Q.pop();
if(res && cur.x.size() > ans.size()) continue;
//if(++ttt < 20) cout<<"-->"<<cur.x<<"-->"<<cur.mod<<endl;
if(cur.mod == 0) {
ans = cur.x;
return 1;
}
for(int i=0; i<m; i++) {
Node next;
next.x = cur.x + A[i];
next.mod = (cur.mod * c + c2i(A[i])) % n;
if((next.mod && vis[next.mod]) || next.x.size() > 500) continue;
Q.push(next);
vis[next.mod] = 1;
}
}
return 0;
}

int main() {
int T;

//freopen("hdu1226.in", "r", stdin);
scanf("%d", &T);
while(T--) {
scanf("%d%d%d", &n, &c, &m);
int hasz = 0;
for(int i=0; i<m; i++) {
char c = getchar();
while(!(c >= '0' && c<='9') && !('A' <= c && c <= 'F')) c = getchar();
A[i] = c;
if(A[i] == '0') hasz = 1;
}
sort(A, A+m);
if(!n) {
if(hasz) puts("0");
else puts("give me the bomb please");
continue;
}
string ans = "";
if(bfs(ans)) {
cout<<ans<<endl;
} else {
puts("give me the bomb please");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: