A hard puzzle(HDU1097)(快速幂取模)

题目链接:

POJ1097

题面:

在这里插入图片描述

翻译:

问题描述
lcy给了feng5166,lwg,JGShining和Ignatius一个难题:给了a和b,如何知道a^b。每个人都反对这个BT问题,所以lcy使这个问题比开始容易。
这个难题描述的是,给定a和b,如何知道a^b的最后一位数字。但每个人都太懒了,不想解决这个问题,所以他们把这个问题交给你这个智者。

输入
有多个测试用例。每个测试用例由两个数字a和b组成(0<a,b<=2^30)

输出
对于每个测试用例,您应该输出a^b的最后一位数字。

样例输入
7 66
8 800

样例输出
9
6

思路:

这道题目让你求的其实就是a^b对7取模之和的结果是多少,然后我们这边要引入两个知识点,快速幂和快速幂取模
快速幂:

为快速求a^b,我们可以采用折半的思想:
1:当b为偶数时,a^b = = a^(b/2) * a^(b/2)
2:当b为奇数时,a^b = =a * (a^(b/2)) * (a^(b/2))

代码块

int quick_mi(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)//奇数隔单,位运算更快,其实还可以写为,b%2==1
        {
            ans=ans*a;
        }
        a=a*a;//偶数折半
        b=b>>1;//位运算折半,其实还可以写为b=b/2
    }
    return ans;
}

快速幂取模:

1:根据数学公式:a * b%m=(a%m)*(b%m)%m

代码块:

int quick_mi(int a,int b,int c)
{
    int ans=1;
    while(b)
    {
        if(b&1)//奇数隔单
        {
            ans=ans*a%c;
        }
        a=a*a%c;//偶数折半
        b=b>>1;
    }
    return ans;
}

当我们把这两个知识点搞懂了的话,这道题目就相当简单了,我们就只需要按照第二个快速幂取余的代码来写这题,这题目就能轻易AC了

参考代码:

#include<iostream>
using namespace std;
int main()
{
    long long a,b,ans,i;
    while(cin>>a>>b)
    {
        long long ans=1;
        while(b)
        {
            if(b&1)
            {
                ans=(ans%10*a)%10;
            }
            a=(a%10*a%10)%10;
            b=b>>1;
        }
        cout<<ans<<endl;
    }
}
发布了46 篇原创文章 · 获赞 12 · 访问量 1555
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览