#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn = 1e6 + 5;
typedef long long ll;
struct node{
string s;
ll num;
};
ll vis[maxn];
queue<node>q;
ll n,m;
void bfs(){
while(!q.empty()) q.pop();
q.push((node){"1",(1%n)});
vis[(1%n)] = 1;/*
余数不等于0的就记录一下,不要再加进队列
1.凡是已经有过的余数,标记一下
根据同余定理:a和b具有相同的余数
a进去过了,b就不要再进去队列了,达到了剪枝的效果
时间复杂度控制在了1e6以内
*/
while(!q.empty()){
node cur = q.front(); q.pop();
if(cur.num%n == 0){
cout << cur.s << endl;
break;
}
ll tmp = cur.num*10;
if(!vis[(tmp%n)]){
q.push((node){cur.s+"0",(tmp%n)});
/*
2.两个字符串相加才能得到新的字符串
而不是字符串与字符相加
*/
vis[(tmp%n)] = 1;
}
tmp = cur.num*10+1;
if(!vis[(tmp%n)]){
q.push((node){cur.s+"1",(tmp%n)});
vis[(tmp%n)] = 1;
}
}
}
int main(){
scanf("%d",&n);
bfs();
return 0;
}
51 nod 四级题目(同余定理)
最新推荐文章于 2022-01-04 21:33:14 发布