题目:
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值。
例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7。
输入格式
输入仅一行,包含两个整数n, k。
输出格式
输出仅一行,即j(n, k)。
数据范围
1≤n,k≤1091≤n,k≤109
输入样例:
5 3
输出样例:
7
解题报告:
这个题目肯定是没有办法去循环去求解的,必T。所以就开始考虑别的窍门了,就是当k/i的时候,会发现再某一段区间里,他们的数值是相同的and k%i= k - [k/i]*i;咱们可以将一段区间用O(1)的时间计算出来(利用等差数列求和)。
ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
int main()
{
cin>>n>>k;
ll ans=1ll*n*k;
n=min(n,k);
int r;
ll res=0;
for(int i=1;i<=n;i=r+1)
{
r=min(k/(k/i),n);
res+= 1ll*(k/i)*(i+r)*(r-i+1)/2;
}
cout<<ans-res<<endl;
}