快速幂应用场景:
题型:HDOJ-1061-Rightmost Digit
Atcoder Regular Contest 113 B-A ^ B^C
代码模板:
快速幂模板
int qmi(int a,int k,int q)
{
int res=1;
while(k)
{
if(k & 1) res=(LL)res*a%p;
k>>=1;
a=(LL)a*a%p;
}
return res;
}
HDOJ快速幂分析:
HDOJ-1061-Rightmost Digit
求N ^ N个位数上的结果,所以可以直接求(N % 10) ^ N,再将结果对10取余。
快速幂可以参照文章开头给出的模板
AC代码如下:
#include <iostream>
using namespace std;
typedef long long LL;
const int mod=10;
int qmi(LL a,LL k)
{
LL res=1;
while(k)
{
if(k & 1) res=res*a%mod;
a=a*a%mod;
k>>=1;
}
return res;
}
int main()
{
int t;
LL n;
cin>>t;
while(t--)
{
cin>>n;
int ans;
ans=qmi(n%10,n)%10;
cout<<ans<<endl;
}
return 0;
}
规律+快速幂分析:
对于数的幂,1~9的幂级数都有周期,所以根据数字本身的规律也可以直接得到最低位上的数是多少。
0,1,5,6无论经过多少次平方的得数个位数永远是其本身,故输出其本身即可。
2的k次幂个位是2,2k次幂个位是4,,3k次幂是8,4k次幂是6
3的k次幂个位是3,2k次幂个位是9,,3k次幂是7,4k次幂是1
7的k次幂个位是7,2k次幂个位是9,,3k次幂是3,4k次幂是1
8的k次幂个位是8,2k次幂个位是4,,3k次幂是2,4k次幂是6
4的偶次幂个位是6,奇次幂个位是4
9的偶次幂个位是1,奇次幂个位是9
…………
Atcoder Regular Contest 113 B-ABC
提示:本道题需特判一下B^C=0时的情况,因为任何数的0次幂都等于1。只要还原一下取模之前的数,即mod本身就可以了。
AC代码如下:
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include<vector>
#include<algorithm>
#include <queue>
using namespace std;
#define LL long long
LL qmi(LL a,LL k,int p)
{
LL res=1;
while(k)
{
if(k & 1) res=res*a%p;
k>>=1;
a=a*a%p;
}
return res;
}
int main()
{
cin.tie();
LL a,b,c;
int mod;
cin>>a>>b>>c;
a=a%10;
if(a==1 || a==5 || a==6 ||a==0 ) cout<<a;
else
{
if(a==4 || a==9) mod=2;
if(a==2 || a==3 || a==7 || a==8) mod=4;
LL ans1=qmi(b,c,mod);
if(ans1==0) ans1=mod;
LL ans2=qmi(a,ans1,10)%10;
cout<<ans2;
}
return 0;
}