落谷P2261 [CQOI2007]余数求和(数论)

题目背景

数学题,无背景

题目描述

给出正整数 nn 和 kk 计算 G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ nG(n,k)=k mod 1+k mod 2+k mod 3+⋯+k mod n 的值 其中 k\ \bmod\ ik mod i 表示 kk 除以 ii 的余数。

例如 G(10, 5)=5\ \bmod\ 1 + 5\ \bmod\ 2 + 5\ \bmod\ 3 + 5\ \bmod\ 4 + 5\ \bmod\ 5 \cdots + 5\ \bmod\ 10G(10,5)=5 mod 1+5 mod 2+5 mod 3+5 mod 4+5 mod 5⋯+5 mod 10 \qquad\quad\ \ \ =0+1+2+1+0+5+5+5+5+5=29   =0+1+2+1+0+5+5+5+5+5=29

输入输出格式

输入格式:

 

两个整数 nn ,kk

 

输出格式:

 

答案

 

输入输出样例

输入样例#1: 复制

10 5

输出样例#1: 复制

29

说明

30\%: n , k \le 100030%:n,k≤1000

60\%: n , k \le 10^660%:n,k≤106

100\%: n , k \le 10^9100%:n,k≤109


是个好题,记录一下。

k%i == k −i ×⌊ i / k​⌋

ans=∑ ​k% i 转换为 ans=n*k −∑ i× ⌊i/k​⌋

对⌊ i/k​⌋ 打标,分块

可以得到规律

 

1 2 3 4 5 6 7 8 9 10

5 2 1 1 1  0 0 0 0  0

相同的数字分为一块,分为5 , 2, 1 1 1,0 0 0 0 0四块

可以根据k,求出每一块的和,

令t等于每一块的的元素值,t=⌊ i/k​ ⌋

k/t就是块的右边界,再根据右边界得到下一块的左边界

wo~,真是个神奇的东西

#include<bits/stdc++.h>
using namespace std;
using lom=long long;
int main()
{
	lom n,k,ans;
	cin>>n>>k;
	ans=n*k;
	for(lom l=1,r;l<=n;l=r+1)
	{
		lom t=k/l;
		if(t==0) r=n;
		else r=min(k/t,n);
		ans-=t*(r-l+1)*(l+r)/2;
	}
	cout<<ans;
 } 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值