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)
为了防止得数过大,需要保存余数,以字符串的形式保存结果,然后判重,否则有可能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; }
相关文章推荐
- zoj1824
- zoj 2913 Bus Pass
- zoj 2562 More Divisors
- zoj 1051 A New Growth Industry
- zoj 1649 Rescue
- zoj 1073 Round and Round We Go
- zoj 2412 Farm Irrigation
- zoj 2165 Red and Black
- zoj 1082 Stockbroker Grapevine
- zoj 1188 DNA Sorting
- zoj 1221 Risk
- zoj 1053 FDNY to the Rescue!
- zoj 1179 Finding Rectangles
- zoj 1716
- zoj 2104
- zoj 2724
- ZOJ 1542 Network
- ZOJ 3551 Bloodsucker
- zoj 2387
- zoj 3720