小明解密码
题目大意
让你计算n^m的个位(有t组数据)
样例输入
2
3 4
4 5
样例输出
1
4
数据范围限制
对于30%的数据,1≤t≤20,1≤n,m≤8
对于100%的数据,1≤t≤1000,1≤n,m≤10^10
解题方法
这题其实有两种方法,一种是运用个位的规律直接得出结果(这里我就不详细说明了),另一种是我们一想就可以想到的“幂”,但从数据m<=101010^{10}1010可以得知,我们要用快速幂(注意输入要用long long,因为101010^{10}1010>2147483647)
快速幂:
就是将一个幂的指数分成两份如:n10n^{10}n10=n5n^{5}n5×n5n^{5}n5(因为都是10个n相乘),但当指数为奇数时,就要多成一个n,如:n11n^{11}n11=n5n^{5}n5×n5n^{5}n5×n
#include<cstdio>
#include<iostream>
using namespace std;
int t;
long long n,m,ans;
void ksm(long long x)
{if (x==1){ans=n;return;}ksm(x/2);long long d=1;if (x&1) d=n;ans=(ans*ans*d)%10;
}
int main()
{scanf("%d",&t);for (int i=1;i<=t;i++){scanf("%lld %lld",&n,&m);n%=10;ksm(m);printf("%lld\n",ans);}return 0;
}