给定正整数 k ,你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。
返回 n 的长度。如果不存在这样的 n ,就返回-1。
注意: n 可能不符合 64 位带符号整数。
思路:
本题主要借用了余数的一些定理。即:
(a+b)mod m=((a mod m)+(b mod m)) mod m
(a*b) mod m = ((a mod m)*(b mod m)) mod m
因此,可以得到一个结论,当遇到相同的余数时,则表示不存在这样的n。
下面我将说明这个结论怎么得到的:
假设有m1个1和有m2个1,余数一致(m1<m2)。
则可以得到(m2-m1) mod k=((m2 mod k)-(m1 mod k)) mod k=0.因为m1和m2 mod k相同。
此时观察m2-m1的组成:(m2-m1)个1,和m1个0组成,也就是(m2-m1)个1,乘以m1个10.
观察这时候的m1*10。假如10 mod k不为0,则表示m1 mod k等于0或者m2-m1个1 mod k等于0,则在获得m2之前,就已经有了答案。
假如10 mod k为0,则k必定含有因数5或2。但是任何由全1构成的数字,一定不含有结尾0,一定不能被5或2整除,因此此时一定可以确定无解。
综上,要么在获得m2之前,就有了需要的结果。要么,获得m2,此时可以明确无解。
class Solution {
public:
int smallestRepunitDivByK(int k) {
unordered_set<int>st;
int num=1,count=1;
while(!st.count(num)&&num%k)
{
st.insert(num);
num=num*10+1;
num%=k;
count++;
}
if(st.count(num))return -1;
return count;
}
};