Description

作为一个化学小考只有77分的同学,小W感觉很有压力,所以他决定搞化学。今天他开始研究超氧化钾,这是一种很神奇的离子化合物,在高温下空间结构是立方体,如下图所示。有一天教黄交给了小W一个任务:根据教黄多年淘金的经验,他发现超氧化钾有一个神奇的性质就是如果一组有序的整数(x,y,z)满足z=x mod 1+x mod 2+…+x mod y,那么对于超氧化钾来说这个位置上的离子就是一个关键离子。通过用回旋加速器得到高速粒子来攻击这个离子,他就可以获得铜铝制金法的催化剂。现在教黄想知道对于一个给定的x和y对应的z值是多少。

Input

两个整数x,y。

Output

一个整数z。

Sample Input

1 1

Sample Output

0

Data Constraint

40%的数据,y<=10^5。
100%的数据,1<=x,y<=10^9。

思路

这道题用分段的思想,分成根号n段。

整除等于1的一段,整除等于2的一段。。。整除等于根号n的一段
可以发现,每一段就是公差为1的等差数列。
对于其他的暴力即可。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll a[100077];
int main()
{
	ll x,y,ans=0;
	scanf("%lld%lld",&x,&y);
	if(y>x) ans+=x*(y-x),y=x;
	for(int i=1; i<=sqrt(x); i++)
	{
		ans+=x%i; a[i]=x/i;
	}
	for(int i=1; i<=sqrt(x)-1; i++)
	{
		if(y<a[i+1]+1) continue;
		ll p1=min(a[i],y),p2=a[i+1]+1,t1=x%p1,t2=x%p2;
		ans+=(t1+t2)*(p1-p2+1)/2;
	}
	for(int i=sqrt(x)+1; i<=a[(int)sqrt(x)]; i++) ans+=x%i;
	printf("%lld",ans);
}