CF1362C 题解

CF1362C 题目传送门。

input:7

000000

001001

010010

011011

100100

101101

110110

111111

对于最右面一位,每一个数会和相邻的两个数产生差异(但不包括 0077),共 77 组。

对于倒数第二位,每 22 个数就会产生一组差异(去重后),共有 33 组。

对于倒数第三位,每 44 个数会产生一对差异,共 11 组。、

对于倒数第 kk 位,每 2k12^{k-1} 个数会产生一对差异。

720=7\lfloor \frac{7}{2^0} \rfloor=7

721=3\lfloor \frac{7}{2^1} \rfloor=3

722=1\lfloor \frac{7}{2^2} \rfloor=1

ans=7+3+1=11ans=7+3+1=11

继续验证 n=11,1,2000000000000n=11,1,2000000000000,发现可以沿用上面的方式。

依此,我们推论 ans=i=1log2(n) n2ians=\sum_{i=1}^{\log_2(n)}\ \lfloor \frac{n}{2^i} \rfloor

然后写出代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long t,b;
	cin>>t;
	while(t--){
		cin>>b;
		long long i=1,ans=0;
		long long q=b;
		
		while(q){
			q/=2;
			ans+=b/i;
			i*=2;
		}
		cout<<ans<<endl;
	}
	return 0;
}
posted @   Weslie_qwq  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示