牛客练习赛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;
}

 

  

 

posted @ 2019-04-06 22:11  czh~  阅读(123)  评论(0编辑  收藏  举报