题意:
题目等价于求分数 的小数点后第k1 到 k2位的所有数字
直接暴力模拟除法过程是肯定会 T 的,但是我们发现我们不用从头开始模拟,只需要从 第k1位开始模拟就可以了。
直接通过快速幂+取模算出第k1 位的数字。然后我们发现 ,所以暴力枚举除法过程就可以。
ans<<3 + ans<<1 == ans * 10
AC_code:
#include<bits/stdc++.h>
using namespace std;
int main() {
int T;
scanf("%d", &T);
while(T--) {
int m, n, k1, k2;
scanf("%d%d%d%d", &m, &n, &k1, &k2);
int a = 10, b = k1-1;
long long ans = m;
while(b) {
if(b&1) ans = ans * a % n;
a = (long long) a * a % n;
b >>= 1;
}
for(int i = k1; i <= k2; i++) {
ans = (ans<<3) + (ans<<1);
int t = ans / n;
ans = ans % n;
putchar(t + '0');
}
putchar('\n');
}
return 0;
}