小G的约数

小G的约数

https://ac.nowcoder.com/acm/problem/218398

题目

小G定义了两个函数,F(n) 为 n 的约数和,G(n) 为 F(1)+F(2)+...+F(n-1)+F(n)
小G想知道 G(G(n)) 等于多少

解题思路

遍历 1 到 n,其中约数为 i 的数的个数是 n/i。
所以,

long long G(int x){
    long long ans = 0;
    for(int i=1; i<=x; ++i){
        long long t = x/i;
        ans += t*i;
    }
    return ans;
}

上面的代码会超时,使用整除分块来实现。

C++代码

#include<iostream>
using namespace std;

long long G(int x){
    long long ans = 0;
    long long le = 1;
    long long ri;
    while(le <= x){
        long long t = x/le;
        ri = x/t;
        ans += t*(le+ri)*(ri-le+1)/2;    // 在 [1,x] 中,约数为 i 的数有 t 个,其中 i 是 [le,ri] 范围中的数
                                         // 故,ans += t * (le + (le+1) + (le+2) + ... + ri)
        le = ri+1;
    }
    return ans;
}

int main(){
    int n;
    cin >> n;
    cout << G(G(n)) << endl;
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 14:00
白火同学:其实你可以了解一下HR在Boss聊天的机制,想赢牌的前提是先会玩牌。 如果HR长时间没有理你,有可能是因为你的消息被其他应聘者的消息给挤到下面了,HR从上到下有可能只看个三四百个人就要到理想数量的简历了,而你恰好没有被看到,时间一长,你的消息在越来越下面。这种情况就需要你自己活跃一下,把消息提上去。 也可能是HR招的合适的人选了,但会一直挂着岗位,为了省重新开招聘岗位的钱,方便后面随时修改招聘要求。 当然也可能是HR吃饱了没事耍你玩,要了你的简历又不看,就看你自己怎么理解了。
点赞 评论 收藏
分享
06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
07-10 14:08
已编辑
江西农业大学 Java
念旧select:做完把项目放到自己硬盘里给他看,看完拷走
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务