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。
.
.
.
.
.
.
分析
对于一段连续的i…j,如果除k的商相同,那么除k的余数是一个等差数列。这样每一段都可以O(1)求出。
这样问题就变成了对于k/i=p,找到最大的j,使n/j=p。不难发现,若p=0,则j=n。否则j=k/p。
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
using namespace std;
int x,y,j,x1,y1;
long long ans;
int main()
{
scanf("%d%d",&x,&y);
for (int i=1;i<=y;i=j+1)
{
int p=x/i;
if (p==0) j=y; else j=min(x/p,y);
x1=x%i;
y1=x%j;
ans+=(long long)(x1+y1)*(j-i+1)/2;
}
printf("%lld
",ans);
return 0;
}