YBTOJ E. 【例题5】余数之和

在这里插入图片描述
由题可以列出式子 ∑ i n k % i = ∑ i n k − ⌊ k / i ⌋ ∗ i = n ∗ k − ∑ i n ⌊ k / i ⌋ ∗ i \sum_i^nk\%i=\sum_i^nk-\lfloor k/i\rfloor*i=n*k-\sum_i^n\lfloor k/i\rfloor*i ink%i=inkk/ii=nkink/ii
思路有点巧妙,其实可以分块来计算
怎么分块?
对于 ⌊ k i ⌋ \lfloor\frac{k}{i}\rfloor ik的一定时,i是有范围的,在k/i!=0时,很容易得到i的最大值为 k ⌊ k i ⌋ \frac{k}{\lfloor\frac{k}{i}\rfloor} ikk 再将i进行跳跃即可
Code

#include<bits/stdc++.h>
#define re register

#define inl inline

#define int long long

using namespace std;
int read(){
	int sum=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)){sum=(sum<<3)+(sum<<1)+(c^48);c=getchar();}
	return f*sum;
}
int n,k; 
signed main(){
	n=read(),k=read();
	int ans=n*k;
	for(int l=1,r;l<=n;l=r+1){
		r= k/l==0 ? n : min(n,k/(k/l));
		ans-=(l+r)*(k/l)*(r-l+1)/2;
	}
	printf("%lld",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值