51Nod——T 1109 01组成的N的倍数

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1109

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


搜索+同余定理剪枝、
每次入队 (队首*10+0/1)%n 的点,若x%n!=0,则abcdx%n!=0,
所以记录每次的余数,已经出现过的就不能出解不用入队了
 1 #include <cstdio>
 2 #include <queue>
 3 
 4 const int N(1e6+5);
 5 int pre[N],ans[N],n;
 6 std::queue<int>que;
 7 
 8 void cout(int x)
 9 {
10     if(x==-1) return ;
11     cout(pre[x]);
12     printf("%d",ans[x]);
13 }
14 
15 int Presist()
16 {
17     scanf("%d",&n);
18     pre[1]=-1; ans[1]=1; que.push(1);
19     for(int u,v; !que.empty(); )
20     {
21         u=que.front();
22         que.pop();
23         v=(u*10)%n;
24         if(v==0)
25         {
26             cout(u);
27             puts("0");
28             break;
29         }
30         if(!pre[v])
31         {
32             pre[v]=u;
33             ans[v]=0;
34             que.push(v);
35         }
36         v=(u*10+1)%n;
37         if(v==0)
38         {
39             cout(u);
40             puts("1");
41             break;
42         }
43         if(!pre[v])
44         {
45             pre[v]=u;
46             ans[v]=1;
47             que.push(v);
48         }
49     }
50     return 0;
51 }
52 
53 int Aptal=Presist();
54 int main(){;}
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7522956.html