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);
}