Codeforces Round #647 (Div. 2) C. Johnny and Another Rating Drop(思維)

題目直通車
英文題解

題意

兩個數的二進制不同的個數稱爲兩個數的不公平度,求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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章