余数求和——除法分块

Posted jd1412

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了余数求和——除法分块相关的知识,希望对你有一定的参考价值。

传送门:余数求和

本题目中需要计算 (sum_{i=1}^{n}{k mod i})

对于 k mod i , 在写高精度取模时,曾表示为:({k}-{i} imeslfloor frac{k}{i} floor)

故本题中,可以继续采用这种计算方式,将其拆分为:(ans=sum_{i=1}^{n}{k}-{i} imes{lfloor frac{k}{i} floor})

进而,有:(ans={n} imes{k}-sum_{i=1}^{n}{i} imes{lfloorfrac{k}{i} floor})

于是,对于(lfloor frac{k}{i} floor)可以用分块进行处理,取值约为:(sqrt{k})种,故复杂度约为O((sqrt{k}))

#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;

ll n,k;
ll ans;

int main(void)
{
	scanf("%lld%lld",&n,&k);
	
	ans=n*k;
	
	for(int l=1,r;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)/2;//当前块的t*当前块元素的个数*当前块中元素的平均值 
	}
	
	printf("%lld",ans);
	
	return 0;
}


以上是关于余数求和——除法分块的主要内容,如果未能解决你的问题,请参考以下文章

luogu2261 [CQOI2007]余数求和

[CQOI2007]余数求和-整除分块

Luogu P2261 [CQOI2007]余数求和

余数求和(整数分块)

luogu2261余数求和题解--整除分块

bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum