• E


    这道题来说,解题的思路非常的重要,不是暴力能解决的题目。n*k = (10^x) * (10^y)  .y的部分是决定位数上面具体的值。因此得到y之后在int first =10^(y+2) ,就是前三位数字。解决这道题必须要用上<cmath> 之下的很多函数,fmod,pow,log10等等。代码之后将详细介绍它们的用法。

    code :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    
    ll quickpow(ll m,ll n,ll k)  //快速幂取模函数,m:底数:指数,k:取模数
    {
        ll ans=1;          //结果数ans
        m=m%k;
        while(n > 0)       //当指数大于0的时候就执行循环
        {
            if(n&1)       //跟if(n%2 == 1) 的效果一样
                ans = (ans*m)%k;    //消除指数为奇数的影响
            n=n >> 1;          //n的二进制数右移一位;
            m = (m*m) % k;      // 因为指数右移,所以这一步要消除指数右移的影响
        }
        return ans%k;
    }
    //其实快速幂取模跟快速幂函数相差无几,只是记得在关键步骤后面要对K取模,防止数据爆掉;
    
    int main()
    {
        ll m,n,T;
        scanf("%lld",&T);
        for(int i=1;i<=T;i++)
        {
            scanf("%lld %lld",&m,&n);
            int first = pow(10.0,2.0+fmod(n*log10(m*1.0),1));
    
            //cout<<"mod = "<<mod<<endl;
            int second = quickpow(m,n,1000);
            printf("Case %d: %d %03d
    ",i,first,second);
        }
        return 0;
    }
    /*
    1、%03d 输出形式
    2、n&1 的判断格式
    3、fmod 函数的用法
    4、pow 函数的用法
    5、快速幂取模函数
    */

     代码上面的:

    第一点:%03d  的输出格式,前三位不会出现019这样的情况,但是后三位会出现,当后三位是019这样的情况时,为输出保证是三位数而不是19,就要写成%03d;(这是题目的小陷阱,多注意)。

    第二点:n & 1  的书写格式可以参照,意思就是判断数的奇偶性,起到的效果跟n % 2 == 1 一样。

    第三点:fmod 函数,double fmod(double x,double y);函数返回x/y的余数。举个例子:在这道题中,a=15.123456的小数部分怎么得到?就是fmod(a,1.0);就可以了。

    第四点:double pow(double base,double exp);

    第五点:学会熟练运用快速幂取模函数,可以把它跟快速幂函数一起记忆,因为他们之间有很多相似点。

    最最重要的一点就是这道题的解题思路,log10n=指数。n*k = (10^x) * (10^y)  .10^y 的值才是决定位数上面的具体的值。这是要记下的!!!

  • 相关阅读:
    动态规划-石子问题
    动态规划-最长不下降子序列
    STL 二分查找
    动态规划-最长公共子序列与最长公共子串
    动态规划-背包问题
    高精度运算模板学习
    二叉树 | 根据前序、后序生成中序
    03.动画
    02.绘制函数
    01.hello world
  • 原文地址:https://www.cnblogs.com/myxdashuaige/p/8992380.html
Copyright © 2020-2023  润新知