题意:
给定正整数 K
,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。
返回 N
的长度。如果不存在这样的 N
,就返回 -1
。
题解:
一开始我还想dfs爆搜,但是预处理起来很麻烦。
没想到,真是没想到,还有这种操作!!!∑(゚Д゚ノ)ノ,直接遍历1e6个1的组合就行了。
其中如果K中含有2和5的因数的话就明显无解,这里可以加一个优化,效果你们看得到。
还能不能正经的出题了ヽ(ー_ー)ノ
代码:
class Solution {
public:
int smallestRepunitDivByK(int k) {
if(k%2==0||k%5==0)return -1;
int ans = 0;
for(int i=0;i<1e6;i++){
ans = ans*10+1;
int aa = ans % k;
if(aa==0)return i+1;
ans = aa;
}
return -1;
}
};
貌似看到一种比较靠谱的做法:
因为如果除不尽的话,余数会有循环周期的,那么只需要看看余数会不会出现重复的就行了,用set记录一下余数就ok。
class Solution {
public:
int smallestRepunitDivByK(int K) {
set<int> s;
int c = 1;
int rmd = 1%K;//余数
while(!s.count(rmd)) {
if(prod == 0) {
return c;
}
s.insert(rmd);
rmd = (rmd*10+1)%K;
c++;
}
return -1;
}
};