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; }
相关文章推荐
- HDU 1226 超级密码 (搜素)
- HDU - 1226 超级密码
- HDU 1226 超级密码| NYOJ 929 密码宝盒
- HDU 1226 超级密码 队列解
- hdu 1226 超级密码 bfs
- HDU 1226 超级密码
- hdu 1226 超级密码 bfs+大整数对long取模
- HDU-1226 超级密码 (BFS+剪枝)
- hdu 1226 超级密码
- HDU - 1226 超级密码
- 【搜索】 HDU 1226 超级密码
- HDU 1226 超级密码| NYOJ 929 密码宝盒
- hdu 1226 超级密码
- HDU - 1226 超级密码 【余数标记状态】
- 【搜索】 HDU 1226 超级密码
- HDU 1226 超级密码
- hdu 1226 超级密码【BFS】
- [HDU 1226]超级密码:BFS
- hdu 1226 超级密码
- hdu1226超级密码【数字广搜+大数取模】