标签:des style blog io ar color os sp java
Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 820 Accepted Submission(s): 2027 15 16 101 0
7 555 16 1111
题意:
给一个n,让你找出含不同数字最少的n的倍数,如果含不同数字相同,则输出最小的。
同余,bfs
定理:
对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。
因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数m。而m只由a、0组成。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <set>
#include <queue>
#include <string>
using namespace std;
const int maxn = 100000;
int N;
int a[5], cnt;
string ans;
int ansn;
struct node{
short d;
int pre;
int re;
};
node q[maxn];
int head, tail;
string tmp;
inline int cmpstr(string a, string b){
if( a.size()<b.size() || (a.size()==b.size()&&a<b) )
return -1;
return 1;
}
bool hash[70000];
bool bfs(){
head = tail = 0;
node nt, qt;
memset(hash, 0, sizeof hash );
for(int i=0; i<cnt; ++i){
if(a[i]==0) continue;
nt.d = a[i];
nt.pre = -1;
nt.re = a[i] % N;
q[tail++] = nt;
hash[nt.re] = 1;
}
while(head<tail){
nt = q[head];
for(int i=0; i<cnt; ++i){
qt.d = a[i]; qt.pre = head; qt.re = (nt.re*10+a[i]) % N;
if(!hash[qt.re]){
hash[qt.re] = 1;
q[tail++] = qt;
}
if(qt.re==0){
tmp = "";
for(int pos=tail-1; pos!=-1; pos = q[pos].pre){
tmp += q[pos].d + '0';
}
reverse(tmp.begin(), tmp.end());
return 1;
}
}
head++;
}
return 0;
}
void solve(int N){
set<int> st;
ans = "";
for(int x=N, y; x>0; x/=10){
y = x % 10;
ans += y + '0';
st.insert(y);
}
ansn = st.size();
reverse(ans.begin(), ans.end());
cnt = 1;
for(a[0]=1; a[0]<10; ++a[0]){
if(bfs())
if(ansn>cnt || (ansn==cnt&&cmpstr(tmp,ans)<0) ){
ans = tmp;
ansn = cnt;
}
}
if(ansn==cnt){
printf("%s\n", ans.c_str());
return ;
}
cnt = 2;
for(a[0]=0; a[0]<10; ++a[0]){
for(a[1]=a[0]+1; a[1]<10; ++a[1]){
if(bfs())
if(ansn>cnt ||(ansn==cnt&&cmpstr(tmp,ans)<0)){
ans = tmp;
ansn = cnt;
}
}
}
printf("%s\n", ans.c_str());
}
template<class T>
inline bool scan_d(T &ret){
char c; ret = 0;
while((c=getchar())<'0'||c>'9');
while(c>='0'&&c<='9') ret = ret*10 + (c-'0'),c=getchar();
return 0;
}
int main(){
// freopen("in.txt","r",stdin);
while(true){
scan_d(N);
if(N==0) break;
if(N<10){
printf("%d\n", N);
continue;
}
solve(N);
}
return 0;
}
hdu 1664 Different Digits, spoj 3929 , 同余,bfs
标签:des style blog io ar color os sp java
原文地址:http://blog.csdn.net/yew1eb/article/details/41686841