钻石c 用数论分块,对每个相同值的区间求出两个端点和值,然后直接用len*v得到区间值,B站讲解视频 https://www.bilibili.com/video/BV1sZ4y1g74R?p=4

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef vector<int> vii;
typedef vector<ll> vll;
typedef pair<int,int> PII;
#define so sizeof
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
const db esp=1e-5;
const int N=1e3+10,M=1e2+10,Max=1e5+5,inf=0x3f3f3f3f,mod=1000000007;
const ll INF=0x3f3f3f3f3f3f3f3f;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param n int整型
     * @return long长整型
     */
    ll intpart(ll n,ll st,ll en){
        ll res=0;
        if(en>n)    en=n;
        for(ll l=en, r=en;r>=1;r=l-1){
            ll v=(n+r-1)/r;
            l=max(1ll,(n+v-1)/v);
            res=(res+v*(r-l+1));//按题目公式具体展开,+(式子*长度)
        }
        return res;
    }
    long long Sum(int n) {
        // write code here
        return intpart(n,1,n);
    }
}T;