题目链接
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1109
题意
给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。
例如:N = 4,M = 100。
题解
一个很显然的思路就是BFS。
但是M的值可能会超过long long,所以判断M是否是N的倍数不能直接用M%N==0?去判断。
M=N*k+r。
当r==0时,M是N的倍数。
M变成10M时,r变成10r;
M变成10M+1时,r变成10r+1.
故用字符串来表示M,用r来判断是否是N的倍数。进行BFS即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
typedef unsigned long long ll;
ll n;
bool vis[maxn];
struct node
{string s;ll r;node(string s,ll r):s(s),r(r){}
};
void bfs()
{queue<node> que;que.push(node("1",1%n));memset(vis,false,sizeof(vis));vis[1%n]=true;while(!que.empty()){node tmp=que.front();que.pop();string s=tmp.s;ll r=tmp.r;if(r==0){cout<<s<<endl;return ;}ll x=r*10;x%=n;if(!vis[x]){vis[x]=true;string nxt=s+"0";que.push(node(nxt,x));}x=r*10+1;x%=n;if(!vis[x]){vis[x]=true;string nxt=s+"1";que.push(node(nxt,x));}}
}
int main()
{while(~scanf("%lld",&n)){bfs();}return 0;
}