题意:
这个男孩现在正在看以二进制系统写的连续参与者的评分。他认为,这种评分差异越大,这些人挨在一起就越不公平。他把两个数字之间的差异定义为位数,其中一个数字是0,另一个是1(我们假设数字的前导零填充到相同的长度)。例如,5=1012和14=11102的差值等于3,因为0101和1110相差3个位置。约翰尼将比赛的不公平性定义为相邻参赛者所计算的这种差异的总和。
约翰尼刚刚给你发了评级序列,希望你能找出比赛的不公平性。你已经注意到,你已经得到了一个从0到n的连续整数序列。这很奇怪,但这个男孩固执地说一切都很正确。所以请帮助他,为收到的数字找到所需的不公平。
输入
输入由多个测试案例组成。第一行包含一个整数t(1≤t≤10000)--测试案例的数量。接下来的t行包含测试用例的描述。
每个测试案例的第一行也是唯一一行包含一个整数n(1≤n≤1018)。
输出
输出t行。对于每个测试用例,你应该输出一个整数的单行--如果评分序列等于0,1,...,n-1,n,比赛的不公平性。
题解:
打表写几个例子
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)
以后写这种问题:
考虑每一位对总值的贡献
- #include<iostream>
- #include<vector>
- using namespace std;
- int main()
- {
- int t;
- cin >> t;
- while(t--)
- {
- long long n;
- cin >> n;
- long long sum = 0;
- while(n)
- {
- sum += n;
- n = n/2;
- }
- cout<<sum<<"\n";
- }
- }