题目大意:给定一个正整数k,找到最小的整数n可以被k整除。N是数字1的组合,例如1,11,111,1111...
这道题的关键:
1、余数是循环的;
2、next_mod = (10*pre_mod +1)%k
证明:已有(a+b)%k =(a%k+b%k)%k
next_mod = next%k = (10*pre+1)%k = ((10*pre)%k+1%k)%k = (((10*(pre%k))%k +1%k)%k = ((10*pre_mod)%k +1%k)%k = (10*pre_mod+1)%k
有一点点绕,如果有更简洁的证明方法欢迎留言!
3、如果K的尾数是2,4,5,6,8
的话,一定不存在N。简单说明:我们要求的N结尾一定是1,那么一定不能被2的倍数整除。另外我们知道能被5整除的数字的结尾必须是0或者5,所以得证。
class Solution(object): def smallestRepunitDivByK(self, K): """ :type K: int :rtype: int """ if K % 10 not in {1, 3, 7, 9}: return -1 mod, mod_set = 0, set() for length in range(1, K + 1): mod = (10 * mod + 1) % K if mod == 0: return length if mod in mod_set: return -1 mod_set.add(mod) return -1