D - Masked Popcount

lightsong發表於2024-06-09

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

相關文章