钻石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;