这个题吧。。。英文读题加yy题,其实还是个快速幂。这个英文是真的好难读啊。。。
就 三个房子(a、b、c),在a房子中有很多很多外星人,外星人按次序编号,要求将外星人全部移动到c房子中,条件是:每次只能移动一个外星人,移动一次花费一分钟,每次移动只能在相邻的房子中进行,当且仅当这两个房子(外星人从一个出进另外一个)中,只有编号是最大的外形人才能移动。问最少的移动时间是多少。结果对给定值取余。其实这个题目跟汉诺塔极其类似,因此它一定存在一个简单的通项公式,并且是指数型的。我们通过计算得知,当只有一个外星人时 最少时间为2 即a[1]=2 ,a[2]=8,a[3]=26,a[4]=80猜测递推公式为 a[n] = a[n-1]*3 + 2;然后通过待定系数法计算出通项公式 a[n] = (3^n) - 1 {a>1}; a[1] = 2;
然后吧。。。wrong了一个点,以为是自己以前的模板写搓了。。。后来发现是这么一回事。最后有个ans-1,那个如果ans mol完之后==0的话,-1就成了-1.应该(ans+mol-1)%mol;
#include<cstdio>
#include<cstring>
#include<cstring>
#include<algorithm>
using namespace std;
long long m;
long long pow(long long a , long long n)
{
long long res = 1;
while(n){
if(n & 1) res = (res * a ) % m;
a = (a * a ) % m;
n >>= 1;
}
return res;
}
int main()
{
long long x;
scanf("%I64d %I64d",&x , &m);
long long ans = pow(3 , x);
printf("%I64d\n",(ans - 1 + m)%m);
return 0;
}