【问题标题】:Find how many numbers that are perfect squares and the sqrt() is a prime number in a L, R range找出有多少个数是完全平方且 sqrt() 是 L、R 范围内的质数
【发布时间】:2020-02-19 15:38:09
【问题描述】:

首先,请随时改进问题的格式

Goswin von Brederlow 已经解决了这个问题!

你好,我正在练习编程,遇到了这个问题,我不知道如何解决这个问题的最佳方法:

问题有 T 个测试用例,包括:

给定一个范围 L 和 R,找出有多少个数满足约束:

i) 数是完美的正方形;

ii) sqrt(Number) 是一个素数。

限制:

1

1

时间限制:1 秒

所以,我尝试了一个简单的想法,即使用 unodered_map(lld, bool) 对每个 sqrt(Number) 的所有答案进行预处理,因为 Number 是一个完美的正方形

之后,我传入范围 pow(sqrt(l), 2) 并将其递增下一个奇数...例如:4 9 16 25,差值是奇数:5 7 9...

我的代码:

long long int l, r; scanf("%lld %lld", &l, &r);
long long int odd = ceil(sqrt(l)), n = odd*odd;
odd = (2*odd) + 1;
long long int ans = 0;
while((n >= l && n <= r)){
    it = h.find(n);
    ans = ans + it->second;
    n = n + odd; 
    odd = odd + 2;
}

但是我仍然有 TLE,我需要一些帮助,谢谢!

【问题讨论】:

标签: c++ time-complexity primes


【解决方案1】:

我看到的唯一问题是我从“我不知道如何解决这个问题的最佳方法”中推断出来的。

你的方法似乎已经很聪明了。即使只是粘贴的一小段代码,您也有一些错误。您似乎计算了数字的总和,而不是计算它们。

我可以想到改进的一件事是计数本身。看起来你有一个所有素数平方的哈希表,如果它们在表中,你只需测试所有 auqares。

为什么不用素数做一棵平衡树呢?在每个节点中,您存储子树的最小和最大数量以及计数。叶子将是 (n, n, 1),其中 n 是素数的平方之一。给定 L 和 R,然后您可以遍历树并总结区间内的所有子树并递归到仅部分位于内部的子树。忽略外面的一切。这应该会为您的复杂性增加一个对数因子。

【讨论】:

  • 你甚至不需要一棵树。您可以创建一个数组,对 L 和 R 进行二进制或字典搜索并返回它们的距离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多