1. 程式人生 > >bzoj 1257餘數之和sum 除法分塊

bzoj 1257餘數之和sum 除法分塊

Description

給出正整數n和k,計算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值其中k mod i表示k除以i的餘數。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

Input

輸入僅一行,包含兩個整數n, k。1<=n ,k<=10^9

Output

輸出僅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7



//用除法分塊的時間複雜度約為sqrt(n)
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
int main() {
	ll n,k;
	cin>>n>>k;
	ll ans=n*k;
	for(ll l=1,r; l<=n&&l<=k; l=r+1) {
		r=min(n,k/(k/l));
		ans-=(ll)(k/l)*(r-l+1)*(r+l)/2;
	}
	cout<<ans<<endl;
	return 0;
}