解析:
找規律
對於這種二進制串算貢獻的,一般我們都要按位處理
我們樣例 n=5來說
000
001
010
011
100
101
第0位對答案的貢獻爲:5 也就是(n)
第1位對答案的貢獻爲:2 也就是(n/2)
第2位對答案的貢獻爲:1 也就是(n/22)
再舉個例子;
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
第0位對答案的貢獻爲:9 也就是(n)
第1位對答案的貢獻爲:4 也就是(n/2)
第2位對答案的貢獻爲:2 也就是(n/22)
第3位對答案的貢獻爲:1 也就是(n/23)
所以規律就是:
第i位的貢獻位 n/2i
最後累加起來求和即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll a;
int main()
{
cin>>t;
while(t--)
{
cin>>a;
ll p=1;
ll sum=0;
while(a)
{
sum+=a/1;
a>>=1;
}
cout<<sum<<endl;
}
}