题目链接:
题面:
翻译:
问题描述
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取模之和的结果是多少,然后我们这边要引入两个知识点,<mark>快速幂和快速幂取模</mark>
快速幂:
为快速求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;
}
}