专栏文章
题解:AT_abc400_c [ABC400C] 2^a b^2
AT_abc400_c题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mippby8t
- 此快照首次捕获于
- 2025/12/03 15:44 3 个月前
- 此快照最后确认于
- 2025/12/03 15:44 3 个月前
前言
一道不错的,难度适中的数论题
简要问题重述
一个正整数 被称为“好整数”,当且仅当存在一对正整数 满足 。给定一个正整数 N ,求在 1 到 N 之间(包括 N )的所有“好整数”的个数。
解题思路
- 枚举 :对于每一个可能的 ,计算对应的 的最大可能值,然后统计满足条件的 b 的个数。
- 通过 可以解出 。
- 必须是正整数,因此 的最大值是 。
- 避免重复计数:注意到 可以是任意正整数,但不同的 对可能导致相同的 。例如 都得到 。
- 为了避免重复计数,我们需要确保每个 只被计数一次。可以通过限制 为奇数来实现这一点。
- 那么为何呢?因为如果 是偶数,比如 ,那么 ,这可以表示为另一个 和 的形式。因此,只统计 为奇数的情况可以避免重复。
- 统计 b 为奇数的个数:对于固定的 的最大值是 。奇数 的个数是 。
代码
复杂度为 ,赛时不知为何调的濒临红温。
CPP#include<bits/stdc++.h>
using namespace std;
long long i(long long K) {
long long s = sqrtl(K);
while (s * s > K) {
s--;
}
while ((s + 1) * (s + 1) <= K) {
s++;
}
return s;
}
int main() {
long long N;
cin >> N;
long long ans = 0;
for (int a = 1; ; a++) {
long long power = 1LL << a;
if (power > N) {
break;
}
long long K = N / power;
if (K == 0) {
break;
}
long long s = i(K);
long long count = (s + 1) / 2;
ans += count;
}
cout << ans << endl;
return 0;
}
后言
审核大大求过,第一篇捏
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...