D - Masked Popcount
https://atcoder.jp/contests/abc356/tasks/abc356_d
思路
對於m的所有為1的bit位置,統計 0 ~ n 中所有對應對bit位置中1的個數,
如何統計呢?
觀察如下bit位表:
從右向左第一位 迴圈節為 0 1
從右向左第一位 迴圈節為 0 0 1 1
從右向左第一位 迴圈節為 0 0 0 0 1 1 1 1
0 --- 0 0 0 0
1 --- 0 0 0 1
2 --- 0 0 1 0
3 --- 0 0 1 1
4 --- 0 1 0 0
5 --- 0 1 0 1
6 --- 0 1 1 0
7 --- 0 1 1 1
8 --- 1 0 0 0
實現上注意:
(1)最後一個非完整迴圈塊中餘數中1的統計
(2)迴圈的規律是按照數序規律 0 對應 第1, 1對應 第2, ... n對應第n+1
Code
https://atcoder.jp/contests/abc356/submissions/54397329
#include <bits/stdc++.h> using namespace std; const long long mod=998244353; int main(){ long long n,m; cin>>n>>m; n++; long long ans=0; for(int i=0;i<60;i++){ if(m&(1ll<<i)){ ans+=(n)/(1ll<<(i+1))%mod*(1ll<<i)%mod; ans%=mod; if(n%(1ll<<(i+1)))ans+=max(0ll,n%(1ll<<(i+1))-(1ll<<i)); // cout<<ans; ans%=mod; } } cout<<ans; }