HDU 1061 Rightmost Digit (四则运算求余,快速幂)

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).
 

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








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值