整除分块

整除分块

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

原文地址:https://www.cnblogs.com/XJack/p/12356382.html