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<bits/stdc++.h>
#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);
}