基准时间限制:1 秒 空间限制:131072 KB 分值: 40
难度:4级算法题
给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。
例如:N = 4,M = 100。
Input
输入1个数N。(1 <= N <= 10^6)
Output
输出符合条件的最小的M。
Input示例
4
Output示例
100
思路:该题目用BFS+剪枝来求解,对于m,从最高位开始搜索,判断是否可整除;
对于剪枝:可保留每次搜索对于n的余数p,当p已经搜索过时,则已经没必要在继续往下搜索了;
#include<iostream>
#include<vector>
using namespace std;
const int MAX_N=1000005;
struct node{
int id;
int x;
int p;
int nex;
};
int n,ans;
vector<int> m;
bool book[MAX_N];
void BFS(void);
int main()
{
cin>>n;
BFS();
for(int i=m.size()-1;i>=0;--i)
cout<<m[i];
cout<<endl;
return 0;
}
void BFS(void)
{
int l=0,k=0;
vector<node> Q;
if(n==1){
m.push_back(1);
return;
}
Q.push_back({k++,1,1%n,-1});
int p=1;
while(l<=k&&p){
node c=Q[l++];
for(int i=0;i<=1;++i)
{
p=(c.p*10+i)%n;
if(!p){
Q.push_back({k,i,p,c.id});
break;
}
if(book[p]==false){
Q.push_back({k++,i,p,c.id});
book[p]=true;
}
}
}
for(int i=k;i!=-1;i=Q[i].nex)
m.push_back(Q[i].x);
}