记一道关于分块的题目

链接:https://ac.nowcoder.com/acm/contest/11160/C
来源:牛客网

题目描述

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

输入描述:

小G会给你一个n

输出描述:

输出一个数G(G(n))即可

示例1

输入

5

输出

371

备注:

数据范围:
1<=n<=5e4


代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll S(ll n){//前n项和
    return n*(n+1)/2;
}
ll G(int n){
    ll res=0;
    int sq=sqrt(n);
    for(int i=1;i<=sq;i++){
        res+=n/i*i;
        if(n/i!=i)//这里很重要
        res+=i*(S(n/i)-S(n/(i+1)));
    }
    return res;
}
int main(){
    ll n;
    cin>>n;
    //cout<<G(n)<<endl;
    cout<<G(G(n))<<endl;
}

 

posted @ 2021-03-04 17:17  xuanzo  阅读(89)  评论(0)    收藏  举报