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

来源:互联网 发布:财务管理app软件 编辑:程序博客网 时间:2024/05/18 12:28


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);}



原创粉丝点击