AtCoder Beginner Contest 340C - Divide and Divide

problem link

Naively, a brute force recursion solution be implemented with O ( n ) \mathcal O (n) O(n) complexity.

复制代码
int work(int x)
{
	if(x==1)return 0;
	return x+work(x>>1)+work((x>>1)+(x&1))
}

However, since all possible x x x can be represented as n ⋅ 2 − k + [ 0 / 1 ] n\cdot 2^{-k}+[0/1] n⋅2−k+[0/1], the number of possible x x x does not exceed 2 ⋅ log ⁡ 2 ( n ) 2\cdot \log_2(n) 2⋅log2(n)

Then, we can intuitively implement a memorization search with map.

cpp 复制代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
map <long long,long long> f;
long long n,ans;
long long work(long long x)
{
	if(x==1)return 0;
	if(f[x])return f[x];
	return f[x]=x+work(x>>1)+work((x>>1)+(x&1));
}
int main()
{
	cin>>n;
	cout<<work(n)<<endl;
	return 0;
}
相关推荐
LIUDAN'S WORLD几秒前
C++零基础实践教程 函数 数组、字符串与 Vector
开发语言·c++·算法
南川琼语18 分钟前
算法——希尔排序
数据结构·算法·排序算法
xiongmaodaxia_z731 分钟前
python数据类型处理题,输出素数题
数据结构·算法
ゞ 正在缓冲99%…2 小时前
leetcode14.最长公共前缀
java·算法·leetcode
神经星星2 小时前
覆盖40+主流模型及数据集,上海交大团队发布一站式蛋白质工程设计平台VenusFactory,一键部署教程已上线
数据库·人工智能·算法
LuckyLay3 小时前
LeetCode算法题(Go语言实现)_49
算法·leetcode·golang
ElseWhereR3 小时前
二进制求和 - 简单
c++·算法·leetcode
天天扭码3 小时前
LeetCode 题解 | 1.两数之和(最优解)
前端·javascript·算法