代码
#include<fstream>
using namespace std;
ifstream cin(
"tower.in");
ofstream cout(
"tower.out");
long long n,m,k,ans;

int pow(int n)
{
long long p;
if (n==0) return 1;
else
{
p
=pow(n >> 1);
p
=(p*p) % k;
if (n & 1==1) p=(p*2) % k;
return p;
}
}

int main()
{
cin
>>n>>m>>k;
ans
=pow(n);
ans
=ans*(m+1) % k;
cout
<<ans<<endl;
system(
"pause");
return 0;
}

 

 

【问题描述】

有若干个圆饼套在一根柱子里,形成了一个汉诺塔(圆饼从上到下依次编号为1~p),我们想把汉诺塔从0号柱子移到n+1号柱子,中间有n个柱子和m块空地给我们使用。移动规则如下:

1.     从0号柱子移出的圆饼不能移回0号柱子,移到n+1号柱子的圆饼不能再移动。

2.     I号圆饼只能放在I+1号圆饼上、空地上和柱子最下面。

3.     空地上只能放一个圆饼,而柱子上可以按规则2形成汉诺塔。

4.     可以直接将圆饼从0号柱子移到n+1号柱子。

现在我们有n个柱子和m块空地可以使用,问你最多可以将多高的汉诺塔从0号柱子移到n+1号柱子(高度是指形成汉诺塔的圆饼数目)。由于高度可能很大,所以只需你求出高度mod k的值。

 

【输入格式】

只有一行,为三个正整数n,m,k,三个数分别用空格隔开。

 

【输出格式】

只有一个数,为最大高度mod k的值。

 

【输入样例】tower.in

1 1 10

 

【输出样例】tower.out

4

 

【数据规模】

对于50%的数据n,m,k<=103

对于80%的数据n,m,k<=106

对于100%的数据n,m,k<=109