开始大概看一下数据范围1e12,就觉得这是一个思维题,结果一直WA,又被题骗了,没想到这是一个线性dp题。好像区间dp但又不是,竟然二分来写了。
题目链接
记忆化搜索+递推
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100010,mod=1e9+7;
int f[N];
map<int,int>S;
void init()
{
for(int i=2;i<N;i++)
{
f[i]=f[i/2]+f[i-i/2]+(i-i/2*2);
}
}
int dfs(int u)
{
if(u<N)return f[u];
if(S.count(u))return S[u];
return S[u]=dfs(u/2)+dfs(u-u/2)+u-u/2*2;
}
signed main()
{
int T;
cin>>T;
init();
while(T--)
{
int n;
cin>>n;
cout<<dfs(n)<<endl;
}
}