🦁
ABC356D
問題
解法
ビット毎に独立して計算できることと,和の順序を入れ替えられる事に気を付ける.
まず,簡単のために
なぜなら,2進数で表記すると,
次に,
また,同じ数だけ 0 も出てくる.
最後に,
よって,
サイクルが割り切れる部分については,
余りの部分については,
コード
main.cpp
ll f(ll i, ll n){
ll cyc = 1LL << (i+1);
ll rem = n % cyc;
ll quo = n / cyc;
ll ans = 0;
ans += quo * (cyc / 2);
ans += max(rem - ((cyc /2) -1), 0LL);
return ans;
}
int main() {
ll n,m;
cin >> n >> m ;
mint ans;
rep(i,60){
if(m >> i & 1)
ans += f(i,n);
}
cout << ans.val() << endl;
return 0;
}
Discussion