汉诺塔--大数非递归(快速幂取模)

 

写在前面

如果你对快速幂取模没有概念的话,强烈建议先去把快速幂以及快速幂取模看完。

在此推荐几篇快速幂入门的博客:

https://blog.csdn.net/iwts_24/article/details/79780596(强烈推荐此篇)

https://blog.csdn.net/DBC_121/article/details/77646508

题目

链接nyoj——汉诺塔1

分析:

显然是一道快速幂求模运算的,因为金片数量已经达到了1000000·····(好多),所以用简单的递归或者非递归算法是无法实现得,时间空间复杂度肯定是AC不过的。

但是为什么用到快速幂呢:给一个汉诺塔的通解:移动 n 层金片需要步数 = ( 2 ^ n )-1

显然这道题看起来已经很水了,知道通解 + 快速幂取模 就OK了。

不多spk了,代码如下:  

#include <iostream>
#include <cstdio>
using namespace std;

long long fun(long long b)
{
	long long ans=1,base=2;
	int r=1000000;
	while(b)
	{
		if(b&1)
			ans=(ans*base)%r;
		base= ((base%r)*(base%r))%r;
		b >>= 1;
	}
	return ans;
}
int main()
{
	int a;
	long long b;
	cin>>a;
	while(a--)    //输入输出没用cin 、cout是因为节省时间,scanf比cin要快好多的 
	{
		scanf("%lld",&b); //注意一下long long int 的输入输出格式。
		b=fun(b)-1;
		printf("%lld\n",b);
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值