cf1512G - Short Task //on
发布日期:2021-05-07 22:06:57 浏览次数:19 分类:精选文章

本文共 967 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要预处理一个数组来快速回答每个查询。具体来说,我们需要找到最小的n,使得d(n)等于给定的c。d(n)定义为n的所有因数的和。

方法思路

  • 问题分析:d(n) 是n的所有因数之和,这是一个积性函数。我们可以利用积性函数的性质来预处理结果。
  • 预处理策略:我们需要预处理一个数组ans,其中ans[c]存储满足d(n)=c的最小n。预处理的时间复杂度是O(n log n),适用于n=1e7的情况。
  • 计算因数和:使用欧拉筛法来计算每个数的因数和。对于每个质数p,计算其幂次的因数和,然后利用积性函数的性质来计算合数的因数和。
  • 优化预处理:通过遍历每个数i,对i的倍数进行更新,计算每个数的因数和,并记录最小的n。
  • 解决代码

    #include 
    using namespace std;
    const long long N = 1e7 + 10;
    ll d[N], ans[N];
    int main() {
    for (ll i = 1; i < N; ++i) {
    for (ll j = i; j < N; j += i) {
    d[j] += i;
    }
    }
    for (ll i = 1; i < N; ++i) {
    if (d[i] < N && ans[d[i]] == -1) {
    ans[d[i]] = i;
    }
    }
    ll T;
    cin >> T;
    while (T--) {
    ll c;
    cin >> c;
    cout << ans[c] << endl;
    }
    return 0;
    }

    代码解释

  • 初始化数组:d数组用于存储每个数的因数和,ans数组用于存储每个c对应的最小n。
  • 预处理d数组:遍历每个数i,对i的倍数进行更新,计算每个数的因数和。
  • 预处理ans数组:遍历每个数i,找到最小的n使得d(n)=i,并将ans[i]记录下来。
  • 处理查询:对于每个查询,直接输出ans[c]即可。
  • 这种方法利用预处理技术,使得每个查询的时间复杂度为O(1),非常高效。

    上一篇:cf1509E - Almost Sorted
    下一篇:cf1511E - Colorings and Dominoes

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月03日 20时37分31秒