hdu1061-Rightmost Digit(附快速幂简单原理)

http://acm.hdu.edu.cn/showproblem.php?pid=1061

1.快速幂实现a^N
求3^999(a=3,N=999):3 ^ 999 = 3 * 3 * 3 * … * 3,直接乘要做998次乘法。
快速幂方法实质使用了二分法进行时间优化:
 tmp+   =   tmp-*    a-;
3 ^ 1  =    3*    1
3 ^ 2  = (3 ^ 1)* (3 ^ 1)
3 ^ 4  = (3 ^ 2) *(3 ^ 2)
…………
3 ^ 256 = (3 ^ 128) * (3 ^ 128)
3 ^ 512 = (3 ^ 256) * (3 ^ 256)
==>
3 ^ 999 
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3 
只做16次乘法。
将999转为2进制数:1111100111
1    1   1   1  1 0 0 1 1 1
512 256 128 64 32 0 0 4 2 1
各个位上的值即为需要进行乘积的标志。

 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "algorithm"
#include "iostream"

using namespace std;

#define INT __int64
int Pow( INT n )
{
	int temp = n % 10 ;
	int ans = 1 ;
	while( n )
	{
		if( n % 2 == 1 )
		{
			n-- ;
			ans *= temp;
			ans %= 10 ;
		}
		else
		{
			n /= 2 ;
			temp *= temp ;
			temp %= 10 ;
		}
		ans %= 10 ;
	}
	return ans ;
} 
	
int main()
{
	INT n ;
	int Case ;
	cin >> Case ;
	while( Case-- )
	{
		cin >> n ; 
		cout << Pow( n ) << endl ;
	}
	return 0;
}


 

下面是发现没20个数据存在循环,之前没有将num[ 0] 赋值为0 ,总是WA,还怀疑规律是不是错了,但是突然发现20的倍数mod20会为0

#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std; 

int main()
{
	__int64 n ;
	int a , b , num[ 50 ] ;
	int i ;
	num[ 0 ] = 0 ; 
	for(i = 1 ; i <= 20 ; i++ )
	{
		a = i ;
		b = 1 ;
		while ( a-- )
		{
			b = b * i % 10 ;
		}
		num[ i ] = b ;
	}
	int Case ;
	cin >> Case;
	{
	while( Case-- )
	{	
		cin >> n ;
		n = n % 20 ;
	//	cout << n << endl ;
		cout << num[ n ] << endl ;
	}
}
	return 0 ;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值