題意:
如上題,給你一個分數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");
}
}