【题解】 P2261 [CQOI2007]余数求和

\(Decription:\)

给出两个数n,k,求\(\sum_{i=1}^{n}k\%i\)

\(Sample\) \(Input:\)

10 5

\(Sample\) \(Output:\)

29

这题要求余数的和,考虑和除法有些密不可分的关系,那就化化式子

\(\sum_{i=1}^{k} k-k/i*i\)

\(n*k-\sum_{i=1}^{k} k/i*i\)

那么我们考虑用除法分块求。

每一个块内的和是等差数列,那么可以快速就出一个块的和。

因为块的个数不会对于根号个,所以复杂度有保证。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,ans,l,r;
signed main(){
	scanf("%lld%lld",&n,&k);
	for(l=1;l<=n;l=r+1){
		if(k/l!=0) r=min(k/(k/l),n);
		else r=n;
		ans-=(k/l)*(r-l+1)*(l+r)>>1;
	}
	ans+=n*k;
	printf("%lld\n",ans);
	return 0;
}
posted @ 2019-04-09 16:10  章鱼那个哥  阅读(131)  评论(0编辑  收藏  举报