https://ac.nowcoder.com/acm/contest/548/B
题目等价于求分数 abab 的小数点后 K1到 K2 位的所有数字。
直接暴力模拟除法过程是肯定会 T 的,但是我们发现我们不用从头开始模拟,只需要从 K1K1 位开始模拟就可以了。
直接通过快速幂+取模算出第 K1K1 位的数字。然后我们发现 K2−K1≤105K2−K1≤105,所以暴力枚举除法过程就可以。
时间复杂度 O(n)。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<climits>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define LL long long
LL qpow(LL a,LL b,LL p){
LL res = 1;
for(;b;b>>=1,a=a*a%p)
if(b&1) res = res * a % p;
return res;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
LL a,b,k1,k2;
cin >> a >> b >> k1 >> k2;
LL ans = ((a % b) % b * qpow(10, k1 - 1, b)) % b;
//cout<<ans;
for(LL i = k1;i <= k2; i++,ans = ans % b) {
ans *= 10;
cout<<ans/b;
}
cout << endl;
}
return 0;
}