传送门
【题目】:
给你n,k;
【题解】:
根据多个人的博客,我终于看懂了,其实就很简单,大家认真分析即可。
首先对这个式子进行一系列地化简:
发现每一个位置i,整除k都会得到不同的值。
然后对于不同的值,进行分块处理。
对于每一块来说,都有左右端点。左端点L=i,那么右端点呢???
∵k/L=k/R
∴R=k/(k/L)
可能会出现k/L=0,此时加一个判断直接让R=n.
区间求和:等差数列求和。
暂存值:t=k/L
个数为:R-L+1
那么一段区间的值为:t*(R-L+1)*(L+R)/2
看代码呗;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,ans;
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> k;
for ( int L=1 , R ; L<=n ; L=R+1 ){
ll tmp = k/L;
R = tmp ? min( k/tmp , n) : n;
ans = ans + tmp* ( R - L + 1 )*(L+R)/2;
}
ans = n*k - ans;
cout<<ans<<endl;
return 0;
}