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;
}