题目链接
思路
考虑除法原理, 对于 \(1 / 8\) 整个过程如下:
\[1 / 8 = 0 , 1 \bmod 8 = 1 \\
1 * 10 / 8 = 1, 10 \bmod 8 = 2 \\
2 * 10 / 8 = 2, 20 \bmod 8 = 4 \\
4 * 10 / 8 = 5, 40 \bmod 8 = 0 \\
\]
则对于\(\frac{a}{b}\)第\(n\)位小数可以表示为\(10 \mid ((a * 10^{n - 1}) \bmod b)\), 所以我们可以用快速幂\(O(logn)\)的解决该问题。
Code
#include <bits/stdc++.h>
using i64 = long long;
i64 a, b, n;
i64 quick_pow(i64 a, i64 b, i64 m) {
i64 res = 1;
while (b) {
if (b & 1) res = res * a % m;
a = a * a % m;
b >>= 1;
}
return res;
}
int main() {
std::cin >> a >> b >> n;
a = a * quick_pow(10, n - 1, b) % b;
for (int i = 1; i <= 3; i ++) {
a *= 10;
std::cout << a / b;
a %= b;
}
}