Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! C. Johnny and Another Rating Drop (结论题)

https://codeforces.com/problemset/problem/1362/C

题目大意:

给定一个数字n,我们定义二进制位数不同称为差异性,比如(101)2和(000)2它们之间的差异性就是2

让我们求出从0开始,两两已知比较差异性并且相加直到加完和n的二进制差异性。

问这个数字是多少?
input 
5
5
7
11
1
2000000000000
output 
8
11
19
1
3999999999987

感觉1400的题目集突然难度就上来了,是因为我已经写的足够多了是吗?
玄学结论,我猜不出啊

知道结论之后确实好写哈哈,但是不好想

//这1400的题目怎么看着越来越玄学了?
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
LL cal(LL x)
{
    LL res=0;
    while(x)
    {
        res+=x;//从当前自己的位置一直加到0
        x>>=1;//每次都除以2
    }
    return res;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        cout<<cal(n)<<endl;
    }
    return 0;
}
posted @ 2022-10-07 21:28  Vijurria  阅读(19)  评论(0编辑  收藏  举报