【问题标题】:Number of Factors (Codechef Level:-Medium)因素数(Codechef 级别:- 中)
【发布时间】:2020-03-17 17:29:31
【问题描述】:

Alice 最近学习了因式分解。鲍勃认为她没有 正确地学习了它,因此他决定测验她。鲍勃给 爱丽丝一个非常大的数字,并要求她找出 这个数字的因素。为了让她轻松一点,他 将数字表示为 N 个数字的乘积。爱丽丝很害怕 大数字,因此向您寻求帮助。你的任务很简单。 给定 N 个数字,你需要告诉不同因素的数量 这 N 个数的乘积。

输入输入的第一行包含一个整数 T,即测试用例的数量。

每个测试都以包含单个整数 N 的行开始。下一个 行由 N 个空格分隔的整数 (Ai) 组成。

输出对于每个测试用例,在单独的行上输出给定数字乘积的因子总数。

约束 1 ≤ T ≤ 100, 1 ≤ N ≤ 10, 2 ≤ Ai ≤ 1000000

我的答案

#include <bits/stdc++.h>
using namespace std;
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n;
    cin >> n;
    long long int p = 1, a, c = 0;
    while (n--) {
      cin >> a;
      p *= a;
    }
    for (int i = 1; i <= p; i++) {
      if (p % i == 0)
        c++;
    }
    cout << c << endl;
  }
  return 0;
}

在 Codechef 中编译我的程序时,只执行小数字。无法编译较大的数字。所以在 Codechef 中,结果显示“Time Limit Exceeded(TLE)”。

【问题讨论】:

  • 另外,请停止使用在线评委和竞赛网站作为学习资源,因为它们不是。请选择a couple of good books 或上一两节课。
  • 看看最坏的情况。十个 1000000 (1000000^10) 的乘积是 10^60。 10^60 次迭代,每次 1 纳秒将花费 3*10^43 年。即使限制为有符号的 64 位,每次一纳秒迭代所有正数也需要将近 300 年。你需要一种比蛮力搜索更聪明的方法,Alice 害怕大数字是对的。
  • 不是求所有 Ai 的乘积,然后进行因式分解,你能找到每个输入的素因数,然后用各个素因数计算乘积的所有唯一因数吗?
  • 这能回答你的问题吗? Factor a large number efficiently with gmp

标签: c++


【解决方案1】:

您解决问题的方法没有利用它的一个重要方面,即数字已经表示为一些整数的乘积。因此,如果您可以分别找到这 N 个数中的每一个的素因数分解(可以在 O(logn) 内有效地完成,使用筛算法),那么它就像计算其中唯一因子的数量一样简单。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2013-12-14
    • 2016-02-08
    • 2021-03-01
    • 2021-11-19
    相关资源
    最近更新 更多