对于某个数量的星星来说,它的连同的最小代价应该是将其折半后拼接,那么折半后折半下来的其余部分也按照这样折半的思路去,之后全部相加就是最小的代价。
//以星星为第一维,那么每加入一个星星能够得到的代价作为二维。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int dfs(int depth) {
if (depth==0) return 0;
if (depth==1) return 0;
if (depth==2) return 0;
if (depth==3) return 1;
if (depth&1) {
return dfs(depth/2)+dfs(depth/2+1)+1;
}
return dfs(depth/2)*2;
}
signed main() {
int T;
cin>>T;
while (T--) {
int n;
cin>>n;
cout<<dfs(n)<<endl;
}
return 0;
}

京公网安备 11010502036488号