[bzoj 1257][洛谷 2261] [CQOI2007]余数求和 {约数+除数分块}

本文详细解析了洛谷平台上的P2261题目,通过数学推导和算法优化,提供了高效的解题思路。介绍了如何利用除数分块的方法减少计算复杂度,给出了解题代码。

题目

https://www.luogu.org/problemnew/show/P2261


解题思路

我们注意到 k   m o d   i = k − ⌊ k i ⌋ ∗ i k\ mod\ i=k-\left \lfloor \frac{k}{i} \right \rfloor*i k mod i=kiki,可以转换成 n ∗ k − ∑ i = 1 n ⌊ k i ⌋ ∗ i n*k-\sum_{i=1}^{n}\left \lfloor \frac{k}{i} \right \rfloor*i nki=1niki
对于任意整数 x ∈ [ 1 , k ] x\in \left [ 1,k \right ] x[1,k],设 g ( x ) = ⌊ k ÷ ⌊ k x ⌋ ⌋ g(x)=\left \lfloor k\div \left \lfloor \frac{k}{x} \right \rfloor \right \rfloor g(x)=k÷xk。所以 g ( x ) ≥ ⌊ k ÷ k x ⌋ = x g(x)\geq \left \lfloor k\div \frac{k}{x} \right \rfloor=x g(x)k÷xk=x,故 ⌊ k ÷ g ( x ) ⌋ ≤ ⌊ k / x ⌋ \left \lfloor k\div g(x) \right \rfloor\leq \left \lfloor k/x \right \rfloor k÷g(x)k/x
另外 ⌊ k / g ( x ) ⌋ ≥ ⌊ k / ( k / ⌊ k / x ⌋ ) ⌋ = ⌊ k / k ∗ ⌊ k / x ⌋ ⌋ = ⌊ k / x ⌋ \left \lfloor k/ g(x) \right \rfloor\geq \left \lfloor k/(k/\left \lfloor k/x \right \rfloor) \right \rfloor =\left \lfloor k/k*\left \lfloor k/x \right \rfloor \right \rfloor =\left \lfloor k/x \right \rfloor k/g(x)k/(k/k/x)=k/kk/x=k/x ⌊ k / g ( x ) ⌋ = ⌊ k / x ⌋ \left \lfloor k/g(x) \right \rfloor=\left \lfloor k/x \right \rfloor k/g(x)=k/x可得 ∀ i ∈ [ x , ⌊ k ÷ ⌊ k x ⌋ ⌋ ] , ⌊ k / i ⌋ 的 值 相 等 。 \forall i \in \left [ x,\left \lfloor k \div \left \lfloor \frac{k}{x} \right \rfloor \right \rfloor \right ],\left \lfloor k/i \right \rfloor的值相等。 i[x,k÷xk],k/i

如果还不懂,可以参考 https://www.luogu.org/problemnew/solution/P2261


代码除数分块

#include<cstdio>
#include<algorithm>
#define ll long long 
using namespace std;
ll n,k,ans; 
int main(){
	scanf("%lld%lld",&n,&k); ans=n*k;
	for(register int x=1,gx;x<=n;x=gx+1){
		gx=k/x?min(k/(k/x),n):n; 
		ans-=(k/x)*(x+gx)*(gx-x+1)/2; 
	}
	printf("%lld",ans); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值