考虑x个8的整数可以表示为$\dfrac{10^x-1}{9}\times 8$,于是这个问题相当于求解最小的x满足:
$$
\dfrac{10^x-1}{9}\times 8 \equiv 0\ (mod\ L)
$$
整理下就是:
$$
8(10^x-1) \equiv 0\ (mod\ 9L)
$$
为了满足条件,8的存在可以化简一下模数,直接放进去考虑,即:
$$
10^x-1 \equiv 0\ (mod\ \dfrac{9L}{\gcd(L, 8)})
$$
也就是:
$$
10^x \equiv 1\ (mod\ \dfrac{9L}{\gcd(L, 8)})
$$
令$p=\dfrac{9L}{\gcd(L, 8)}$,考虑$x$与$p$不一定互质,所以应用欧拉定理,得到一个可行解:令$x=\phi(p)$
$$
10^{\phi(p)} \equiv 1\ (mod\ p)
$$
由于$\phi(p)$不一定是满足条件的最小自然数,但是可以证明满足上式的$x$一定是$\phi(p)$的因子,于是我们枚举$\phi(p)$的因子判断是否满足条件即可。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
LL mul(LL x, LL n, LL mod) {
LL ret = 1;
while (n) {
if (n & 1) ret = ret * x % mod;
n >>= 1;
x = x * x % mod;
}
return ret;
}
LL phi(LL x) {
LL ret = x;
for (LL i = 2; i * i <= x; i++) {
if (x % i == 0) {
ret = ret / i * (i - 1);
while (x % i == 0) x /= i;
}
}
if (x > 1) ret = ret / x * (x - 1);
return ret;
}
signed main() {
// freopen("in", "r", stdin);
LL L;
for (int _ = 1; cin >> L && L; _++) {
LL mod = L / __gcd(8LL, L) * 9LL;
LL p = phi(mod), ret = 1E18;
for (LL x = 1; x * x <= p; x++) {
if (p % x != 0) continue;
if (mul(10, x, mod) == 1) ret = min(ret, x);
if (mul(10, p / x, mod) == 1) ret = min(ret, p / x);
}
printf("Case %d: ", _);
printf("%lld\n", ret == 1E18 ? 0 : ret);
}
return 0;
}
数据变大了
有没有大佬知道这个为什么过不去 感觉分析和代码都是可以的呀
好的吧 是没有用龟速乘 可能是改了数据后数据大了 快速幂的时候要是使用龟速乘
wa了wa了
WA了
现在数据似乎加大了,需要龟速乘
大佬,数论基础有点弱,为什么“明满足上式的xx一定是 ϕ(p)ϕ(p) 的因子”?这一步有点想不通
上网搜欧拉定理以及其证明
很好看懂的
大佬,这份代码过不去了
1999999999 答案是161290320 你的是0
哎我也是!不知道为什么!求教
溢出
溢出了
把8化简过去是怎么弄得 为什么是9L/gcd(L,8)
同问
我知道了,书上的推理其实挺好证明L|8(10^x - 1)/9 <=> 9L| 8(10^x - 1) 假设 d = gcd(8,L) 那么给 9L 和 8同时除以d,则9L| 8(10^x - 1) <=> 9L/d | 8/d (10^x - 1) ,9L/d与8/d肯定是互质的那么9L/d就是(10^x - 1) 的因子,那么 9L/d | 8/d (10^x - 1) <=> 9L/d |(10^x - 1) ,所以(10^x - 1) ≡ 0(mod9L/d)
原来是这样,感谢解惑!
记得写快速乘法
acwing的数据有点弱,你可以去poj上交一次
太棒了
看了半天在这里被教会了 太感人了 orz
L是8的倍数的时候就不是互质的了。$gcd(L,8) = 8$,右边就直接是 $1*(10^x-1)$
妙啊!
终于找到正解,感谢