題意
兩個數的二進制不同的個數稱爲兩個數的不公平度,求1-n個數所有相鄰的兩個數的不公平度的總和。
思路
首先分析n爲2k時,以n=23爲例,n=10002, 從00002到10002
一共有四位數字,我們把它拆出來單獨看:
第一位變化爲010101010…變化週期爲1;
第二位變化爲001100110…變化週期爲2;
第三位變化爲000011110…變化週期爲4;
第四位變化爲000000001…變化週期爲8;
這其實很好理解,對二進制的變化有了解就不難發現第k位變化週期未2k-1,由此可得1-8的二進制變化總和爲1+2+4+8,一般化不難推得n=2k的不公平度總和爲2k+1-1=2n-1;
在考慮n爲任意數字時,我們得到它的二進制數,以n=11=10112爲例:
可以拆成四個數看,把它看成從0-1,00-11,000-000,0000-1000四個過程去看,這裏建議紙上多寫幾位二進制數找一下規律,思考一下
所以此題解法爲判斷n的第i位是不是1,如果是1則總和加上2i+1-1
AC代碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll a;
cin >> a;
ll ans=0;
for(int i=0;i<60;i++)
{
if(a&((ll)1<<i))//與運算判斷第i位是否爲0
ans+= ((ll)1<<(i+1))-1;
}
cout << ans <<endl;
}
int main(){
int t ;
cin >> t;
while(t--)
{
solve();
}
return 0;
}