题目链接
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;
}