题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1257
题目大意:
求
最近在学数论这种东西……
分析可得:
然后呢?
对于N>K的部分,K mod i等于K
剩下的部分,由于K/i是向下取整的,所以K/i的值共有sqrt(k)种,分别是1,2,3,4……k
然后可以把k/i相同的项提取出来,剩下的sum=(l)+(l+1)+(l+2)+(l+3)……+(r-1)+(r),由于是个等差数列可以直接得出公式sum=(r-l+1)l+(r-l+1)(r-l)/2
代码:
#include <iostream>
#define ll long long
using namespace std;
int main()
{
ll n,k,ans = 0;
cin >> n >> k;
if(n >= k)
{
ans = k * (n-k);
n = k-1;
}
for(ll i = 1;i <= n;i ++)
{
ll lst = k/(k/i);
if(lst > n)
lst = n;
ans += k*(lst-i+1) - (k/i)*(lst+i)*(lst-i+1)/2;
i = lst;
}
cout << ans << endl;
return 0;
}