基准时间限制: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
思路: 这个题肯定要想办法开数组存 结果的每一位 , 首先要明白的是 : 假设 一个数x % n 假设x 为556 n为 6 那么 556%6 的值 和
((((5%6)*10+5)%6)*10+6)%6的值 是相同的 至于怎么证明 ,不大会 ,但是看过程应该能看个差不多。
那么我们就用 bfs 可以考虑每一位分别是0和1的情况 并且用vis【】 记录已经出现过的余数 用 fa 记录路径。。
代码:
#include<bits/stdc++.h> using namespace std; struct node { int a,b,pre; }a[2000000]; void output(int k) { if (a[k].pre !=-1) output(a[k].pre); printf("%d",a[k].a); } /* void out(int k) { if (a[k].pre !=-1) output(a[k].pre); printf("%d ",a[k].b); }*/ int used[2000000]; int main() { int n; scanf("%d",&n); if(n==1){ printf("1\n"); return 0; } a[0].a=1; a[0].b=1; a[0].pre=-1; int L=1; int r=0; for (int i=0;i<L;i++){ for (int j=0;j<2;j++) { r=(a[i].b*10+j)%n; if (!used[r]) { a[L].a=j; a[L].b=r; a[L].pre=i; used[r]=1; L++; } if (r==0) break; } if (r==0) break; } //printf("k: %d\n",L-1); output(L-1); //printf("\n"); //out(L-1); printf("\n"); return 0; }