专栏文章

P1096题解

P1096题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioyfruh
此快照首次捕获于
2025/12/03 03:12
3 个月前
此快照最后确认于
2025/12/03 03:12
3 个月前
查看原文

俺老孙又双叒叕来发解了

其实这道题目故弄玄虚,步数其实就是普通汉诺塔的2倍。
然后我们看普通汉诺塔的步数:
方法(n个):
先把上面n-1个移到第二个柱子,再把第n个移到第三个柱子,先把上面n-1个移到第三个柱子;
f(n)=2f(n1)+1f(1)=1f(n)=2n1f(n)=2f(n-1)+1\\f(1)=1\\\rarr f(n)=2^n-1 那么题目要求输出的步数就是: F(n)=2f(n)=2n+12F(n)=2f(n)=2^{n+1}-2 上代码!
CPP
#include<bits/stdc++.h>
using namespace std;
int p,f[1005],l[1005],s[1005];
void s1()
{
    for(int i=1;i<=500;i++)
    {
        for(int j=1;j<=500;j++)
        {
            s[i+j-1]+=l[i]*f[j];
        }
    }
    for(int i=1;i<=500;i++)
    {
        s[i+1]+=s[i]/10;
        s[i]%=10;
    }
    memcpy(l,s,sizeof(l));
}
void s2(){
    memset(s,0,sizeof(s));
    for(int i=1;i<=500;i++)
    {
        for(int j=1;j<=500;j++)
        {
            s[i+j-1]+=f[i]*f[j];
        }
    }
    for(int i=1;i<=500;i++)
    {
        s[i+1]+=s[i]/10;
        s[i]%=10;
    }
    memcpy(f,s,sizeof(f));
}
int main(){
    cin>>p;
    p++;
    l[1]=1;
    f[1]=2;
    while(p!=0)
    {
        if(p%2==1)
        {
            memset(s,0,sizeof(s));
            s1();
        }
        p/=2;
        s2();
    }
    l[1]-=2;
    bool flag=0;
    for(int i=500;i>=1;i--) 
    {
    	if(!l[i]&&!flag)continue;
        cout<<l[i];flag=1;
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...