快速幂模板:
long long PowerMod(long long a,long long b,long long c)
{
long long ans = 1;
a=a%c;
while(b>0)
{
if(b%2==1) ans=(ans*a)%c;
b=b/2;
a=(a*a)%c;
}
return ans;
}
Given a positive integer N, you should output the most right digit of
N^N.
Input
The input contains several test cases. The first line of the input is
a single integer T which is the number of test cases. T test cases
follow. Each test case contains a single positive integer
N(1<=N<=1,000,000,000).
Output
For each test case, you should output the rightmost digit of N^N.
Sample Input
2
3
4
Sample Output
7
6
Hint
In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the
second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
题目意思就是求一个数n的n次方结果对10取模。首先我们来分析一下,整数n的最大取值是10的9次方,显然直接求解肯定会超时。这事我们可以通过快速幂算法来实现.
快速幂详解
#include <iostream>
using namespace std;
int pow1(int a,int b,int c)
{
int ans=1;
a=a%c;
while(b>0)
{
if(b&1) /* 二进制这一位不为0 由于是二进制,很自然地想到用位运算这个强大的工具: & 和 >>.
&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。
还可以判断奇偶x&1==0为偶,x&1==1为奇。>>运算比较单纯,二进制去掉最后一位*/
ans=(ans*a)%c;
a=(a*a)%c; //求二进制数每一位的权
b>>=1; //将b转化成二进制数按位右移,相当于b/=2;例如6>>1,即二进制数110,右移1位,变为011(2)=3(10)
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,n1,ans;
cin>>n;
n1=n%10;
ans=pow1(n1,n,10);
cout<<ans<<endl;
}
return 0;
}
当然对于这样的大型运算也有一定的规律可循,
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,n1,ans=1;
cin>>n;
n1=n%10;
for(int i=1;i<=n%4+4;i++)//for(int i=0;i<=(n-1)%4;i++)//此处可换为 i < n%4 + 4;可解决n%4 ==0的情况
ans*=n1;
cout<<ans%10<<endl;
}
return 0;
}
末位数 相乘后的末位数
1 1
2 4 8 6 2
3 9 7 1 3
4 6 4
5 5
6 6
7 9 3 1 7
8 4 2 6 8
9 1 9(由于x9是奇数,所以1不会出现)
0 0
由上面的分析可见,每个数相乘后最多有四个结果
所以对一个数n,只需做其对4取余后余数次相乘即可
但是会出现 n%4 == 0 的情况
由于x5^x5的末位数是5,x9^x9的末位数是9
所以将n%4转换为(n-1)%4