![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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