您的位置:首页 > 其它

51Nod-1109-01组成的N的倍数

2017-11-18 12:11 288 查看
1109 01组成的N的倍数


基准时间限制: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


51Nod-1109-01组成的N的倍数

思路:该题目用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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: