ZOJ-1136

27 篇文章 0 订阅
26 篇文章 0 订阅

核心思路就是BFS搜索,再加上记录算过的余数,不重复计算

#include<cstdio>
#include<deque>
#include<vector>
#include<utility>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
	int N, M, x;
	bool flag[5000];
	while (scanf("%d", &N) != EOF)
	{
		scanf("%d", &M);
		vector<int> digits;
		for (int i = 0; i < M; i++)
		{
			scanf("%d", &x);
			digits.push_back(x);
		}
		if (!N)
		{
			puts("0");
			continue;
		}
		sort(digits.begin(), digits.end());
		deque<pair<string, int> > queue;
		bool find = false;
		memset(flag, 0, sizeof(flag));
		int rem;
		for (size_t i = 0; i < digits.size(); i++)
			if (digits[i])
			{
				if (digits[i] % N == 0)
				{
					find = true;
					cout << digits[i] << endl;
					break;
				}
				else
				{
					string s;
					s += (digits[i] + '0');
					rem = digits[i] % N;
					flag[rem] = true;
					queue.push_back(make_pair(s, rem));
				}
			}
		if (find)
			continue;
		pair<string, int> now;
		while (!queue.empty() && !find)
		{
			now = queue.front();
			queue.pop_front();
			string s = now.first;
			int rem = now.second;
			for (size_t i = 0; i < digits.size(); i++)
			{
				int next = rem * 10 + digits[i];
				int temp = next % N;
				string ss = s;
				ss += (digits[i] + '0');
				if (temp)
				{
					if (!flag[temp])
					{
						flag[temp] = true;
						queue.push_back(make_pair(ss, temp));
					}
				}
				else
				{
					cout << ss << endl;
					find = true;
					break;
				}
			}
		}
		if (!find)
			puts("0");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值