当前位置: 首页 > news >正文

【题解】AtCoder AT_abc400_c 2^a b^2

题目大意

我们定义满足下面条件的整数 X X X 为“好整数”:

  • 存在一个 正整数 ( a , b ) (a,b) (a,b) 使得 X = 2 a ⋅ b 2 X=2^a\cdot b^2 X=2ab2
    给定一个正整数 N N N 1 ≤ N ≤ 1 0 18 1\le N\le 10^{18} 1N1018),求 1 ∼ N 1\sim N 1N 中有多少“好整数”。

思路

下面是一张表格,第一列的数表示 a a a 的值,第一行表示 b b b 的值,第 x x x 列第 y y y 行的数表示 2 x ⋅ y 2 2^x\cdot y^2 2xy2 的值。

a \ b1234
1281832
24163664
383272128
41664144256

观察可得, 2 1 × 4 2 = 2 3 × 2 2 ,   2 2 × 4 2 = 2 4 × 4 2 2^1\times 4^2=2^3\times2^2,\ 2^2\times4^2=2^4\times 4^2 21×42=23×22, 22×42=24×42,这的确是交换率的体现,但是我们仔细思考会发现,当 b b b 是二的倍数的时候,无论 a a a 取多少,都会有另一对 ( a ′ , b ′ ) (a',b') (a,b) 满足 2 a ′ ⋅ b ′ 2 = 2 a ⋅ b 2 2^{a'}\cdot {b'}^2=2^a\cdot b^2 2ab2=2ab2

那么我们可以基于这个规律来减少枚举次数:枚举 b b b 的值,只需要枚举 1 ∼ ⌊ N ⌋ 1\sim \left \lfloor \sqrt{N}\right \rfloor 1N 的所有 奇数;然后枚举所有满足 2 a ⋅ b 2 ≤ N 2^a\cdot b^2\le N 2ab2N a a a。这种做法不但快捷,还可以保证不重不漏,可以在规定时间内输出正确的答案。

代码

赛时提交记录(含有一些多余内容):Submission #64615650。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;

LL n, ans;

int main()
{
	cin >> n;
	for (LL i = 2; i <= n; i *= 2) ans++;
	for (LL i = 3; i * i * 2 <= n; i += 2)
		for (LL j = 2; i * i * j <= n; j *= 2)
			ans++;
	cout << ans << endl;
	return 0;
}

总结

这是一道数学思维题,难度与比赛分值 350 分相符。希望这篇题解对你有帮助,如有想法欢迎在评论区提出!

相关文章:

  • d202547
  • AF3 OpenFoldMultimerDataModule类解读
  • 【零基础入门unity游戏开发——动画篇】Animation动画窗口,创建编辑动画
  • uniapp微信小程序地图marker自定义气泡 customCallout偶尔显示不全解决办法
  • 本地大模型构建个人知识库(Ragflow)
  • Oracle序列介绍
  • Web开发:常用 HTML 表单标签介绍
  • 数据类型与判断
  • 【后端开发面试题】每日 3 题(三十)
  • CentralCache
  • 登录窗口布局
  • 具身智能零碎知识点(一):深入解析Transformer位置编码
  • oracle 包的管理
  • ffmpeg提取字幕
  • 八大排序——c++版
  • 如何使用 Coze 的 HTTP 请求节点实现高效数据交互
  • 《深度揭秘:借助MySQL实现AI模型训练全程追溯》
  • 数据驱动金融韧性升级,开启数据交换“新范式”:构建“实时、国产化强适配”的数据交换与共享平台
  • java基础使用- 泛型
  • 《DeepSeek RAG 增强检索知识库系统》Ollama DeepSeek 流式应答页面对接之三
  • 使用网站/怎么查询最新网站
  • wordpress后台背景/seo研究中心论坛
  • 网站网站地图怎么做/免费发布信息网网站
  • 企业网站建站软件/微信加人推码35一单
  • 医院网站建设与管理ppt/百度一下浏览器下载安装
  • 网站跳出率怎么算/网站推广seo优化