题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.
解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。
简单证明:
因为
这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间。所以这个无穷数列中间必定存在循环节。即假设有s,t均是正整数,且s<t,有 。于是循环节长度为t-s。于是10^s = 10^t。因此有:
,所以
剪枝
假设对所有的 1,0 组合数字进行搜索 ,则形成一个树
1
10 11
100 101 110 111
...
n 层的书,第 k 层树个数 2^(k-1) 假设数字在m层总搜索次数为 o(2^m),改进:
假设 x y 为树中两个数 x%M == y%M ,则 10*x%M == 10*y%M (10*x+1) %M==(10*y+1)
则 假设 x < y 则 y 所在的子树实际上已经剪枝,该子树不需要在考虑了。
代码暂时没写
扩展问题暂无思考
以上来源于
http://yiminghe.javaeye.com/blog/421914
http://www.cnblogs.com/bvbook/archive/2009/02/06/1385448.html