题意
就是给你一个L,问有最少多少个连续的8组成的整数G,使得G%L=0。
思路
这儿参考此大佬的题解
我们设最少x个8能满足上述条件。
G
=
1
0
x
−
1
9
×
8
.
∵
G
m
o
d
L
=
0
.
∴
9
L
∣
8
×
(
1
0
x
−
1
)
G \ = \ \frac{10^x-1}{9} \times 8 \\ . \\ \because G \ mod \ L = 0 \\ .\\ \therefore 9L \ | \ 8 \times (10^x -1)
G = 910x−1×8.∵G mod L=0.∴9L ∣ 8×(10x−1)
现在我们要将上式子进行进一步化简。我们设
1
0
x
−
1
=
A
10^x-1 = A
10x−1=A,所以
(
9
L
∣
8
A
)
(9L \ | \ 8A)
(9L ∣ 8A),因为
g
c
d
(
8
,
9
)
=
1
gcd(8, 9) = 1
gcd(8,9)=1没有意义,所以我们设
d
=
g
c
d
(
8
,
L
)
d = gcd(8, L)
d=gcd(8,L)。于是我们就有
(
9
L
d
∣
8
d
×
A
)
(\frac{9L}{d} \ | \ \frac{8}{d} \times A)
(d9L ∣ d8×A) ,那么现在
g
c
d
(
L
d
,
8
d
)
=
g
c
d
(
9
L
d
,
8
d
)
=
1
gcd(\frac{L}{d}, \frac{8}{d}) = gcd(\frac{9L}{d}, \frac{8}{d}) = 1
gcd(dL,d8)=gcd(d9L,d8)=1,证明
(
8
d
m
o
d
9
L
d
≠
0
)
(\frac{8}{d} \ mod \ \frac{9L}{d} \ne 0)
(d8 mod d9L=0)但是因为
(
9
L
d
∣
8
d
×
A
)
(\frac{9L}{d} \ | \ \frac{8}{d} \times A)
(d9L ∣ d8×A)始终要成立那么足以说明
(
9
l
d
∣
A
)
(\frac{9l}{d} | A)
(d9l∣A)始终成立,那么我们的
8
d
\frac{8}{d}
d8可以省略,因为
8
d
\frac{8}{d}
d8对消去
L
d
\frac{L}{d}
dL的质因子没有贡献。如果证明
(
9
l
d
∣
A
)
(\frac{9l}{d} | A)
(d9l∣A)我们也可以采用反正法。
那么在上述化简过后我们就得到最终的表达式:
9
L
d
∣
(
1
0
x
−
1
)
<
1
>
.
C
∣
(
1
0
x
−
1
)
(
C
=
9
L
d
)
<
2
>
\frac{9L}{d} \ | \ (10^x -1) \ \ \ \ <1>\\ . \\C \ | \ (10^x-1) \ (C = \frac{9L}{d}) \ \ <2>
d9L ∣ (10x−1) <1>.C ∣ (10x−1) (C=d9L) <2>
接着我们可以把<2>式转化成
1
0
x
m
o
d
c
=
1
10^x \ mod \ c = 1
10x mod c=1,
1
0
x
≡
1
(
m
o
d
c
)
10^x \equiv 1 \ (mod \ c)
10x≡1 (mod c)。这里的形式就类似于欧拉定理:
a
ϕ
(
c
)
≡
1
(
m
o
d
c
)
g
c
d
(
a
,
c
)
=
1
a^{\phi(c)} \equiv 1 (mod \ c) \ gcd(a, c) = 1
aϕ(c)≡1(mod c) gcd(a,c)=1,但是欧拉定理不能保证
ϕ
(
n
)
\phi(n)
ϕ(n)是满足等式的最小值。那么在一些大佬的题解中看到了一个结论:
满足上述式子的最小正整数x一定是
ϕ
(
c
)
\phi(c)
ϕ(c)的约数,即
x
∣
ϕ
(
c
)
x | \phi(c)
x∣ϕ(c)。
反证法证明上述结论:假设该最小正整数x不是
ϕ
(
x
)
\phi(x)
ϕ(x)的约数,则
ϕ
(
c
)
=
k
x
+
r
(
0
<
r
<
x
)
\phi(c) = kx+r (0 < r < x)
ϕ(c)=kx+r(0<r<x)。
{
1
0
x
≡
1
(
m
o
d
c
)
⟹
1
0
k
x
≡
1
(
m
o
d
c
)
<
3
>
1
0
ϕ
(
c
)
≡
1
(
m
o
d
c
)
⟹
1
0
q
x
+
r
≡
1
(
m
o
d
c
)
<
4
>
\left\{\begin{matrix} 10^x \equiv 1(mod \ c) \Longrightarrow 10^{kx} \equiv 1 (mod \ c) &<3>\\ 10^{\phi(c)} \equiv 1 (mod \ c) \Longrightarrow 10^{qx+r} \equiv 1 (mod \ c) & <4> \end{matrix}\right.
{10x≡1(mod c)⟹10kx≡1(mod c)10ϕ(c)≡1(mod c)⟹10qx+r≡1(mod c)<3><4>
由<4>式除以<3>式得
1
0
r
≡
1
(
m
o
d
c
)
(
0
<
r
<
x
)
10^r \equiv 1 (mod \ c) \ (0 < r < x)
10r≡1(mod c) (0<r<x)
因此存在比x更小得正整数解满足上述式子,矛盾,因此得证。
因为我们这儿引用欧拉定理求解那么我们这儿gcd(10, c) = 1,才会有解。
而后我们只需要暴力枚举出
ϕ
(
c
)
\phi(c)
ϕ(c)得所有约数,找出满足条件得最小正整数解x即可。
PS:这里我们计算
1
0
i
10^i
10i是可能会爆long long的所以我们这儿采用龟速乘来解决该问题。
代码
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr)
#define int long long
#define endl "\n"
#define xx first
#define yy second
using namespace std;
typedef long long LL;
const int N = 3e6 + 10, mod = 998244353;
int n, m, k, _;
int l;
int gcd(int a, int b){return b ? gcd(b, a%b) : a;}
int get_euler(int c) {
int res = c;
for (int i = 2; i <= c / i; ++ i) {
if (c % i == 0) {
int s = 0;
while (c % i == 0) ++ s, c /= i;
res = res / i * (i - 1);
}
}
if (c > 1) res = res / c * (c - 1);
return res;
}
LL qmul(LL a, LL b, LL c) { //龟速乘
LL res = 0;
while (b) {
if (b & 1) res = (res + a) % c;
a = (a + a) % c;
b >>= 1;
}
return res;
}
LL ksm(LL a, LL b, LL c) {
LL res = 1;
while (b) {
if (b & 1) res = qmul(res, a, c);
a = qmul(a, a, c);
b >>= 1;
}
return res;
}
signed main()
{
// IOS;
int T = 1;
while(cin >> l)
{
if(l == 0) break;
int d = gcd(l, 8);
int c = 9*l/d;
int res = 1e18;
if(gcd(10, c) != 1) res = 0;
else
{
int phi = get_euler(c);
for(int i = 1; i * i <= phi; i ++)
{
if(phi % i == 0)
{
if(ksm(10, i, c) == 1) res = min(res, i);
if(ksm(10, phi/i, c) == 1) res = min(res, phi/i);
}
}
}
printf("Case %d: %lld\n", T ++ , res);
}
return 0;
}