Processing math: 100%
0%

1015.可被K整除的最小整数

1015.可被 K 整除的最小整数

题目描述:

给出正整数 k ,需要找出可以被 k 整除的、仅包含数字 1 的最小正整数 n 的长度。如果不存在返回 1 . n 不符合 64 位带符号整数。

数据范围:

1k105

题解:

n 会变得很大,不能直接构造,可以考虑使用余数,整除时余数等于 0 .

(p+q)modn=((pmodn)+(qmodn))modn

(p×q)modm=((pmodm)×(qmodm))modm

因此可以通过 n=(n10+1)modk 来构造 n 的余数。但是需要确定循环次数。因为 modk ,因此余数只有 [0,k1]k 种。如果不能整数,那么就是 [1,k1] 只有 k1 种。循环 k 次肯定会出现 n 等于了前面某一次的结果,继续下去就会进入循环,因此循环 k 次就行。

还可以使用 n=(n+tmp)modk 来实现,对 tmp 每次 tmp=tmp×10modk 。因为公式2, tmp=((tmpmodk)×(10modk))modk 。同样根据鸽笼原理也会出现 n 等于前面某一次结果的情况。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int smallestRepunitDivByK(int k)
{
if (k % 2 == 0)
return -1;
int ans = 0;
for (int i = 0; i < k; ++i)
{
ans = (ans * 10 + 1) % k;
if (ans == 0)
return i + 1;
}
return -1;
}
};
Powered By Valine
v1.5.1