//BFS+同余
为了防止得数过大,需要保存余数,以字符串的形式保存结果,然后判重,否则有可能SF
思想:
1 假设 有数 1,2,3 显然应从小到大枚举这3个数字构成的数,当然数会很大,高精度
1 假设 有数 1,2,3 显然应从小到大枚举这3个数字构成的数,当然数会很大,高精度
k≡k mod n(mod n)
如果a≡b(mod n),c≡d(mod n),则有a±c≡b±d(mod n);a*c≡b*d(mod n)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
const int MAX=5000;
int n,m;
int a[MAX];
bool flag,vis[MAX];
string ans;
struct Mode{
string num;
int mod;
Mode(){}
Mode(string a,int b){num=a,mod=b;}
};
void BFS(){
queue<Mode> q;
Mode cur,next;
q.push(Mode("",0));
memset(vis,0,sizeof(vis));
flag=false;
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0; i<m; i++)
{
next.num=cur.num+(char)(a[i]+'0');
next.mod=(cur.mod*10+a[i])%n;
if(next.num!="0"&&next.mod==0)
{ans=next.num,
flag=true;
return ;
}
if(next.num!="0"&&!vis[next.mod])
{
vis[next.mod]=1;
q.push(next);
}
}
}
}
int main(){
int i;
while(cin>>n)
{
cin>>m;
for(i=0; i<m; i++)
cin>>a[i];
if(n==0) {cout<<"0"<<endl; continue;}
sort(a,a+m);
BFS();
if(!flag) cout<<"0"<<endl;
else cout<<ans<<endl;;
}
return 0;
}
本文探讨了BFS算法与同余概念在解决编程问题中的应用,特别是如何利用队列特性进行数的枚举,同时通过同余运算避免结果过大导致的溢出问题。文中提供了一个实例代码,详细解释了如何实现这一过程。

871

被折叠的 条评论
为什么被折叠?



