zsyzlzy

导航

 

这是本人第一篇博客,写的不好请尽力吐槽。
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 6612 Solved: 3190
[Submit][Status][Discuss]
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
首先,我不知道为什么5s的时限下,暴力为什么过不了。
然后,看书看不懂,网上的博客不清不楚。于是,我又重新看了一遍书……
因为k mod i=kk~ mod~ i =k- kii\left\lfloor\dfrac{k}{i}\right\rfloor*i,所以ans=n*k-i=1n\sum_{i=1}^n kii\left\lfloor\dfrac{k}{i}\right\rfloor *i
对于任意xx\in [1,k][1,k],设g(x)=k/kx\left\lfloor k/\left\lfloor\dfrac{k}{x}\right\rfloor\right\rfloor.
因为函数f(x)=k/xf(x)=k/x(不向下取整)当xN+x \in N+ 时,函数单调递减,g(x)&gt;=k/f(x)=xg(x)&gt;=\left\lfloor k/f(x)\right\rfloor=x,故k/ g(x)\left\lfloor k/ \ g(x)\right\rfloor<=k/x \left\lfloor k/ x \ \right\rfloor

同时,k/ g(x)\left\lfloor k/ \ g(x) \right\rfloor>=k/(k/k/x)\left\lfloor k / ( k/ \left\lfloor k/x \right\rfloor) \right\rfloor(除数小,商就大)=k/kk/ x\left\lfloor k/k* \left\lfloor k / \ x \right\rfloor\right\rfloor=
k/x \left\lfloor k / x\ \right\rfloor.
所以k/ g(x)\left\lfloor k/ \ g(x) \right\rfloor=k/x \left\lfloor k / x\ \right\rfloor
gxg(x)换元得到k/ k/ki\left\lfloor k/ \ \left\lfloor k/\left\lfloor \dfrac{k}{i} \right\rfloor \right\rfloor \right\rfloor=k/x \left\lfloor k / x\ \right\rfloor(好丑啊)
又因为f(x)f(x)的性质,所以当ii\in [x,k/ki\left\lfloor k/\left\lfloor\dfrac{k}{i}\right\rfloor\right\rfloor ]时,f(i)f(i)随着ii的增大而减小(x恒大于0,反比例函数的性质),那么 f(i)\left\lfloor\ f(i) \right\rfloor就是非上升函数,因为两端的i f(i)i ,\left\lfloor\ f(i) \right\rfloor值都相等了,对于中间的i f(i)i ,\left\lfloor\ f(i) \right\rfloor也一定相等。
我们就可以把1~n分成若干块,每一块的 k/i\left\lfloor\ k/i \right\rfloor都相等,于是就可以用等差数列求和的方法就每一块的值。时间复杂度由O(n)O(n)O(n)变为O(\surd{n})
代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
	ll n,k;scanf("%lld%lld",&n,&k);
	ll ans=n*k;
	for(int i=1,m;i<=n;i=m+1)
	{
		k/i?m=min(n,k/(k/i)):m=n;//分块
		ans-=((k/i)*(i+m)*(m-i+1))/2;//等差数列求和
	}
	printf("%lld\n",ans);
	return 0;
}
posted on 2019-04-20 08:49  zsyzlzy  阅读(114)  评论(0编辑  收藏  举报