B.Tachibana Kanade Loves Probability
题目链接:
https://ac.nowcoder.com/acm/contest/548/B
题意:
求出$frac{m}{n}$的$k_{1}$到$k_{2}$位小数
数据范围:
$1leq n,m,k_{1},k_{2} leq 10^{9}$
$0leq k_{2}-k_{1}leq 10^{5}$
分析:
一开始想通过找循环节来做,然后发现循环节大于$10^{5}$时会超时。看别人ac代码发现,其实可以放大m然后求出对n的余数,也就是让$m = m imes 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(" "); } return 0; }