牛客练习赛43
B.Tachibana Kanade Loves Probability
题目链接:
https://ac.nowcoder.com/acm/contest/548/B
题意:
求出$\frac{m}{n}$的$k_{1}$到$k_{2}$位小数
数据范围:
$1\leq n,m,k_{1},k_{2} \leq 10^{9}$
$0\leq k_{2}-k_{1}\leq 10^{5}$
分析:
一开始想通过找循环节来做,然后发现循环节大于$10^{5}$时会超时。看别人ac代码发现,其实可以放大m然后求出对n的余数,也就是让$m = m\times 10^{k_{1}-1}\, \mathbf{mod}\, n$,之后继续模拟$\frac{m}{n}$得到的小数就是题目要求的了
ac代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k1,k2;
ll qpow(ll x,ll y)
{
ll res=1,k=x;
while(y)
{
if(y&1)res=res*k%m;
k=k*k%m;
y/=2;
}
return res;
}
int main()
{
//n=1e9;
//cout<<qpow(10,2)<<endl;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld %lld %lld %lld",&n,&m,&k1,&k2);
n=n*qpow(10,k1-1)%m;//求出余数
for(int i=1;i<=k2-k1+1;i++)
{
printf("%lld",(n*10)/m);
n=(n*10)%m;
}
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号