CF1362C Johnny and Another Rating Drop(二进制、复杂度考虑)
看完数据范围\(n\in[1,1e18]\)就可以先猜一下要不是可以直接推公式,不能暴力去做,更不能遍历一遍,又看到这种2进制的题目,要猜是不是\(log\)级别的复杂度。
可以依次考虑每一位
\(所有i \% 2^0 ==0的数个位都和i-1相差1\)
\(所有i \% 2^1 ==0的数第二位都和i-1相差1\)
\(所有i \% 2^2 ==0的数第三位都和i-1相差1\)
依次类推
依次考虑每个数对于每一位的贡献,将所有位的贡献相加就是答案.
代码就很简单了。
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define ls p<<1
#define rs p<<1|1
#define PII pair<int, int>
#define ll long long
#define ull unsigned long long
#define db double
#define endl '\n'
#define debug(a) cout<<#a<<"="<<a<<endl;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 0x3f3f3f3f
#define x first
#define y second
using namespace std;
const int N=11000;
void solve()
{
ll n,ans=0; cin>>n;
while(n)
{
ans+=n;
n/=2;
}
cout<<ans<<endl;
}
int main()
{
IOS
// freopen("1.in", "r", stdin);
int t;
cin>>t;
while(t--)
solve();
return 0;
}

浙公网安备 33010602011771号