题意:
如上题,给你一个分数m/n,让你输出该分数的第k1~k2位小数
解析:
除法得到分数的过程是
m=m%n
第一位小数: m=m*10
m/n->
m=m%n
第二位小数: m=m*10
m/n->
m=m%n
第三位小数: m=m*10
m/n->
m=m%n
.....
可以看出,第k位小数就是
m=(m*10^(k-1))%n
m=m*10
m/n->
m=m%n
上面那个东西我们可以用快速幂来做
然后暴力输出第k1~k2位就可以了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
char s[N];
ll quickpow(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int k1,k2;
ll n,m;
scanf("%lld%lld%d%d",&m,&n,&k1,&k2);
if(m==n) m=0;
ll s=quickpow(10,k1-1,n);
m=m*s%n;
for(int i=k1;i<=k2;i++)
{
m=m*10;
printf("%d",m/n);
m=m%n;
}
printf("\n");
}
}