写在前面
如果你对快速幂取模没有概念的话,强烈建议先去把快速幂以及快速幂取模看完。
在此推荐几篇快速幂入门的博客:
https://blog.csdn.net/iwts_24/article/details/79780596(强烈推荐此篇)
https://blog.csdn.net/DBC_121/article/details/77646508
题目
分析:
显然是一道快速幂求模运算的,因为金片数量已经达到了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);
}
}