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

题目

题目
题目大意:

给出正整数\(n,k\),求\(\Sigma_{i=1}^{n}{k \bmod i}\)

代码

乍一看只能暴力,其实稍微修改下就变成了数论分块。
\(\Sigma_{i=1}^{n}{k \bmod i}=\Sigma_{i=1}^{n}{\lfloor{\frac{k}{i}}\rfloor} \times i\)
然后就比一般的整除分块只是多了一个i,套板子就行了。

#include <iostream>

using namespace std;
typedef long long ll;
ll n,k,ans;

int main() {
	cin>>n>>k;
	ans=k*n;
	ll r,len;
	for(int l=1;l<=n;l=r+1) {
		if(k/l==0) {
			r=n;
			continue;
		}
		r=min(n,k/(k/l)),len=r-l+1;
		ans-=(l+r)*len/2*(k/l);
	}
	cout<<ans;
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/wyc06/p/12651299.html
今日推荐