添加鏈接描述
題意:對于給定的n,m 。計算0~n 每一個數和m & 之后,得到的數 的二進制中 1的個數的和。
一位一位的算。最多是60位。
我們只需要計算 在 1-n這些數上,有多少個數 第i位 為1.
因為是連續的自然數,每一位上1 的出現 必然存在某種規律。
我們從 第零位 開始計數。
第 i 位 的 1 的出現周期是 2^(i+1) ,其中前一半是0,后一半是1.(數量是 2^i個)
想明白這一點之后,
對于整除的那一部分,第i位的貢獻是
int w=(long long )1<<i;
n/(w*2)*w
那么整的部分算完了,接下來算 散 的那一部分
這里可以自己找個例子,算一下。不然很同意錯。
max((long long )0,n%(2*w)-w+1)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
signed main()
{int n,m;cin>>n>>m;int ans=0;for (int i=0;i<60;i++){if (m>>i &1){int w=(long long )1<<i;ans+=n/(w*2)*w+max((long long )0,n%(2*w)-w+1);ans%=mod;}}cout<<ans<<endl;return 0;
}