题目描述
“别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“
没想到我宝儿姐也有生活所迫的时候,还好我技多不压身,做了一名优秀的混凝土搬运师。
可是,我发现我有强迫症,我非得把一堆n块砖块分成n堆每堆一块儿的才舒服。可是我不知道这样做需要我
花费多少力气。我可以确定的是,我每次尽可能地把一堆砖块均分成两堆,如果能均分,我需要付出1点体力,如果不能
均分,需要我花费2点体力。比如,我把一堆6块砖分成两堆3块的,就花费我1点体力;如果我把一堆11块砖的分成一堆
5块和一堆6块的,需要花费我2点体力。聪明的你请帮我算算,我把这1堆n块砖分成n堆1块砖需要花费多少体力呢?
输入
多实例测试。
第一行一个case,代表测试实例(T<=5)
第二行一个n,代表一堆n块的砖。(n<=1e5)
输出
每组样例输出一个答案,代表宝儿姐需要花费的体力,占一行。
样例输入
1 7
样例输出
8
直接递归求解:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<set>
#include<vector>
#define ll long long
using namespace std;
const ll MAXN=50010;
ll a,b,c,d,sum;
ll fab(ll c){
if(c==1) return 0;
else if(c==2) return 1;
else if(c>2&&c%2==1){
return 2+fab(c/2)+fab(c-c/2);
}
else if(c>2&&c%2==0){
return 1+fab(c/2)+fab(c-c/2);//递归关系
}
}
int main(){
scanf("%lld",&a);
for(int i=0;i<a;i++){
scanf("%lld",&b);
c=fab(b);
printf("%lld\n",c);
}
return 0;
}