汉诺4塔——洛谷 P1573 栈的操作

https://www.luogu.org/problem/show?pid=1573

首先,看出本题的题目原型是Hanoi四塔。
其次,想出动规方程:e[i]=min(2*e[j]+f[i-j])(1<=j < i)(其中f[]为Hanoi三塔的结果,e[]为Hanoi四塔的结果)
最后:找规律。发现e[]相邻两数的差为:1,2,2,4,4,4,8,8,8,8,16,16,16,16,16,…利用此性质解决100%的数据。

我靠我已经想到了dp方程啦的;
但是因为不知道在模域里怎么取min不知道;
然后就放弃啦;
555555555555

#include
#define Ll long long
using namespace std;
Ll n,k,v,ans,mo=1e6+7;
int main()
{
    scanf("%lld",&n);
    k=1;v=1;
    for(k=1,v=1;n>k;n-=k,k++,v=(v+v)%mo)ans=(ans+k*v)%mo;
    printf("%lld",(ans+n*v)%mo);
}

你可能感兴趣的:(汉诺4塔——洛谷 P1573 栈的操作)