题目大意
给定t个数据
每个数据给出a,b,k1,k2四个数
要求求出a/b 小数点后第k1位到k2位的数字
样例
5
2 3 2 3
1 7 1 7
2 5 1 3
12345 54321 3 10
12345 54321 100000 100010
66
1428571
400
72601756
78428232175
思路
这道题的话,我们可以通过模拟除法来解决,但是仔细看数据范围,k2有可能取到10^9,所以模拟这条路肯定行不通
仔细观察这个过程,我们可以发现,小数点后的每一位都与他们上一位的余数有关,就是不断的乘10再余
不知道发现没有,可以用快速幂来解决,可以求出k1位的小数(a*(qow_(10,k1-1,b)))%b;(这里可以自己画图来验证一下)
code
#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
ll qow_(ll a,ll b,ll c){
ll ans=1;
while(b){
if(b&1){
ans=(ans*a)%c;}
b>>=1;
a=(a*a)%c;
}return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
ll a,b,k1,k2;
cin>>a>>b>>k1>>k2;
ll t=((a)*(qow_(10,k1-1,b)))%b;
for(int i=k1;i<=k2;i++){
printf("%lld",t*10/b);
t=t*10%b;
}
printf("\n");
}
return 0;
}