Description
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).
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
就是让你输入n^n的个位数即模除10
关于大数求余的一些技巧,一般那个大整数都是由一些小整数经过运算得到的,而四则运算的求余公式如下(a b均大于等于0):
1.(a+b)%n=((a%n)+(b%n))%n
2.(a-b)%n=((a%n)-(b%n)+n)%n
3.(a*b)%n=((a%n)*(b%n))%n
4.(a/b)%n=((a%n)*(b^-1%n))%n
有了这些公式我们可以得知n^n%10=(n%10)^n%10,而一位整数的n次幂的个位数是一个循环序列,循环区间不超过4。所以基本上可以化为一个简单的幂运算了。
而幂运算我们一般需要自己写一个快速幂运算函数,期间如果需要求余,也可以配合写进去
快速幂求余函数模板:
template<class T,class D>
T qpow(T a,D n,int mod)
{
if(n==0) return 1;//这里的返回值取决于T的类型,如果是矩阵要返回单位矩阵
T ans=qpow(a,n/2,mod);
ans=ans*ans%mod;
if(n%2!=0) ans=ans*a%mod;
return ans;
}
本题代码
#include<stdio.h>
int qpow(int a,int n,int mod)
{
if(n==0) return 1;
int ans=qpow(a,n/2,mod);
ans=ans*ans%mod;
if(n%2!=0) ans=ans*a%mod;
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d",&n);
m=n % 10;
n=n%4==0?4:n%4;
printf("%d\n",qpow(m,n,10));
}
return 0;
}
思路就是化n^n%10为(n%10)^(n%4)%10,其中(n%4)要注意4的时候应该置为4而不是0