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
Output
Input示例
Output示例
51Nod-1109-01组成的N的倍数
思路:该题目用BFS+剪枝来求解,对于m,从最高位开始搜索,判断是否可整除;
对于剪枝:可保留每次搜索对于n的余数p,当p已经搜索过时,则已经没必要在继续往下搜索了;
基准时间限制: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); }
相关文章推荐
- 51nod 1109 —— 01组成的N的倍数
- 【51Nod 1109】01组成的N的倍数
- 51nod 1109 —— 01组成的N的倍数
- 51nod 1109 01组成的N的倍数+
- 51nod 1109 01组成的N的倍数
- ACM_51nod_1109_01组成的N的倍数
- 51nod 1109 01组成的N的倍数
- 51nod 1109 01组成的N的倍数(bfs)
- 51nod 1109 01组成的N的倍数(宽搜+剪枝)
- 51nod 1109 01组成的N的倍数【Bfs+同余定理剪枝】好题!
- 51Nod-1109-01组成的N的倍数
- 51nod 1109 01组成的N的倍数 【dfs+剪枝+vector】
- 51nod 1109 01组成的N的倍数
- 51nod 1109 01组成的N的倍数 (bfs)
- 51NOD 1109 01组成的N的倍数
- 51Nod 1109 01组成的N的倍数
- 51nod 1109 01组成的N的倍数
- 51Nod - 1109 01组成的N的倍数 【bfs+同余定理】
- 51nod-1109 01组成的N的倍数(宽搜)
- POJ 1426 Find The Multiple && 51nod 1109 01组成的N的倍数 (BFS + 同余模定理)