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