牛客周赛144-D

283 字
1 分钟
牛客周赛144-D

牛客周赛144 - D

考点: 位运算 , 同等取余转组合数#

题面#

\hspace{15pt}给定一个区间 [l,r][l,r]和一个整数 k,其中 k 是 2 的非负整数次幂。
\hspace{15pt}请计算有多少个二元组 i,j(l≤i<j≤r)i,j(l\leq i<j\leq r),满足 ixor⁡ji\operatorname{xor} j 是 kk 的倍数。

思考#

\hspace{15pt}要使 ixor⁡ji\operatorname{xor} j 是 kk 的倍数,且发现kk 是 2 的非负整数次幂。则 k 的二进制一定是由 一个1和m−1m-1个0组成。所以对于所有 i,ji,j 当 ixor⁡ji\operatorname{xor}j 的二进制后缀有m−1m-1 个0的时候则成立。 \hspace{15pt}当i,ji,j 的后 m−1m-1 个二进制数相同时成立一个二元组,在所有数 [L,R][L,R] 里共有R-L+1 个数字,对于每种后缀最少有 (R−L+1)/k(R-L+1) / k 种可能。这一部分共有 (R−L+1)×(R−l)÷2×k(R-L+1)\times(R-l)÷2\times k合法二元组。对于剩下的 (R-L+1)%k 则有(R−L+1) mod k×(R−L+1)÷k(R-L+1)\bmod k \times(R-L+1) \div k然后将这两个公式求和即可

代码#

signed main(){
int l,r,k;
cin>>l>>r>>k;
int n=r-l+1;
int q=n/k;
long long ans=q*k*(q-1)/2+n%k*q;
cout<<ans<<endl;
}

思维亮点#

\hspace{15pt}用2的次幂的倍数来将一个区间的数字按 余 来分类然后通过组合数)计算来得到答案

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
牛客周赛144-D
https://firefly1.1298055690.workers.dev/posts/牛客周赛144---d/
作者
影颜
发布于
2026-05-17
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
影颜
行至归处,不知来路
通缉令
被通缉者啊,请你逃往深渊
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
15
分类
5
标签
20
总字数
19,745
运行时长
0 天
最后活动
0 天前

文章目录