超级密码 HDU - 1226(同余剪枝)

超级密码题解
本文介绍了解决HDU-1226超级密码问题的方法。该问题要求找出最小的C进制数X,使得X为N的倍数且仅由特定的M个数字构成。文章详细解释了使用广度优先搜索(BFS)算法进行求解的过程。

超级密码

题目链接:HDU - 1226
题意:给出一个N;求出一个最小的C进制数X, 使得X是N的正整数倍数, 且X只能由给出的M个个位数组成;
同余剪枝, 和poj1456一样, 不过多了一个C进制, 并要求结果不超过500位;
代码感觉很神奇, que数组开小了会TE, 开到40000左右才行, 用vector也TE了, 改着改着突然就AC了, 弄得我很懵;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, c, m;
int digit[20];
struct node{
	int now, pre, mod, len;
}que[40000];
int vis[6000];
void print(int k){
	if(k==0) return;
	print(que[k].pre);
	if(que[k].now<=9) printf("%c", que[k].now+'0');
	else printf("%c", (que[k].now-10+'A'));
}
void bfs(){
	memset(vis, 0, sizeof(vis));
	int head=0,tail=0;
	node tmp;
	tmp.now=0;
	tmp.len=0;
	tmp.mod=0;
	tmp.pre=-1;
	que[tail++]=tmp;
	while(head<tail){
		tmp=que[head];
		for(int i=0; i<m; i++){
			if(tmp.pre==-1&&digit[i]==0) continue;
			int tmod=(tmp.mod*c+digit[i])%n;
			if(vis[tmod]) continue;
			node p;
			if(tmod==0){
				p.mod=tmod;
				p.len=tmp.len+1;
				p.now=digit[i];
				p.pre=head;
				que[tail++]=p;
				print(tail-1);
				printf("\n");
				return;
			}
			p.mod=tmod;
			p.len=tmp.len+1;
			p.now=digit[i];
			p.pre=head;
			if(p.len>=500) continue;
			que[tail++]=p;
		}
		head++;
	}
	printf("give me the bomb please\n");
	return;
}
int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		scanf("%d%d%d", &n, &c, &m);
		char x;
		int flag=0;
		for(int i=0; i<m; i++){
			getchar();
			scanf("%c", &x);
			if(x<='9'&&x>='0') digit[i]=(x-'0');
			else digit[i]=(x-'A')+10;	
			if(digit[i]==0) flag=1;		
		}
		sort(digit, digit+m);
		if(n==0){
			if(flag) printf("0\n");
			else printf("give me the bomb please\n");
			continue;
		}
		bfs();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值