您的位置:首页 > 其它

zoj 1136 Multiple

2013-10-04 10:14 411 查看
//BFS+同余

为了防止得数过大,需要保存余数,以字符串的形式保存结果,然后判重,否则有可能SF

思想:

1 假设 有数 1,2,3 显然应从小到大枚举这3个数字构成的数,当然数会很大,高精度
       1,2,3
       11,12,13,
      111,112,113,
     121,122,123,
    .............................
  通过上述例子,可以看出完全是队列的性质。
2

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