leetcode1015. Smallest Integer Divisible by K

题目大意:给定一个正整数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

 

posted @ 2019-05-05 22:22  冰皮抹茶  阅读(162)  评论(0编辑  收藏  举报