XJack

初一蒟蒻的博客

导航

整除分块

整除分块

整除就是快速求得一个数被一个范围的所有数除的结果之和的一个解决方法
通过随便举一个例子,发现这样的结果大多都会有一些数重复且连续的出现,这时只需求得数量后直接得乘积加到sum里面就可以了

对于被除数k,发现结果i出现的长度其实是 floor(k/(i-1))+1-floor(k/i)
代码过水

附上例题
我谷P2261 [CQOI2007]余数求和代码

#include<iostream>
using namespace std;
long long n,len,sum,k;
int main()
{
	cin>>n>>k;
	for(long long i=1;i<=n;i=k/(k/i)+1){
		if(k/i==0) break;
		len=min(n+1,k/(k/i)+1)-i;
		sum+=(k/i)*((i+i+len-1)*len/2);
	}
	cout<<-sum+k*n;
	return 0;
}

end

posted on 2020-02-24 12:20  XJack  阅读(110)  评论(0编辑  收藏  举报