luogu2261 [CQOI2007] 余数之和
题目大意
求
\]
\(n,k\leq 10^9\)。
题解
先只考虑\(n\leq k\)的情况。
\]
看到
\]
则想到整除分块。
整除分块
结论:
\]
规律
当\(\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor\)一定时,所有满足上式的\(i\)都在一段连续的区间内(组成了一块),区间右端点是\(\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor\)。
因此操作时,直接对一块进行统一操作即可。
数学推导
令一块的左端点为\(l\),右端点为\(r\),\(v=\frac{k}{r}\),我们现在要求一块内的和
\]
此时注意:和式中运算的次数为\(r-l-0+1=r-l+1\),而不是\(r-l\)。所以接下来
\]
\]
在这里错了就完了!
最终运用等差数列的知识得到
\]
把所有的上式加起来再被\(nk\)一减即可。
注意
边界条件:赋值\(r\)时,它不能直接等于\(\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor\),而应当是它和\(n\)的较小值。另外还要考虑\(\lfloor\frac{k}{i}\rfloor=0\)的情况。
对于\(n>k\)的情况,把额外值加上即可。要明确\(n-k\)以及\(k\)的含义呀!
#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
using namespace std;
#define ll long long
int main()
{
ll n, k;
scanf("%lld%lld", &n, &k);
ll ans = 0, extra = 0;
if (n > k)
{
extra = (n - k) * k;
n = k;
}
for (ll l = 1, r; l <= n; l = r + 1)
{
int divVal;
r = (divVal = k / l) ? min(n, k / (k / l)) : n;
ans += divVal * ((r - l + 1) * (l + r) / 2);
assert(ans > 0);
}
printf("%lld\n", n * k - ans + extra);
return 0;
}
luogu2261 [CQOI2007] 余数之和的更多相关文章
- BZOJ 1257: [CQOI2007]余数之和sum
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 3769 Solved: 1734[Submit][St ...
- bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1779 Solved: 823[Submit][Sta ...
- BZOJ 1257: [CQOI2007]余数之和sum( 数论 )
n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i) = ∑ , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连 ...
- 1257: [CQOI2007]余数之和sum
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 2001 Solved: 928[Submit][Sta ...
- BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4474 Solved: 2083[Submit][St ...
- BZOJ_1257_ [CQOI2007]余数之和sum_数学
BZOJ_1257_ [CQOI2007]余数之和sum_数学 题意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值. 分 ...
- BZOJ 1257: [CQOI2007]余数之和
1257: [CQOI2007]余数之和 Time Limit: 5 Sec Memory Limit: 128 MB Description 给出正整数n和k,计算j(n, k)=k mod 1 ...
- 1257: [CQOI2007]余数之和
题目链接 bzoj1257: [CQOI2007]余数之和 题解 数论分块,乘等差数列求和 代码 #include<bits/stdc++.h> using namespace std; ...
- bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum
http://www.lydsy.com/JudgeOnline/problem.php?id=1257 k%i=k-int(k/i)*i 除法分块,对于相同的k/i用等差序列求和来做 #includ ...
随机推荐
- ACM_鸡兔同笼(二元一次方程)
鸡兔同笼 Time Limit: 2000/1000ms (Java/Others) Problem Description: 今有雉兔同笼,上有n头,下有m足,问雉兔各几何? Input: 输入有多 ...
- 2.0 Linux系统的安装之Fedora安装单系统(2)
2.0 Linux系统的安装之Fedora安装单系统(2) *Linux系统的安装之Fedora安装单系统 恐怕最好装的系统就是Linux系统了,或者与Windows并列.此篇教程为Fedora的单系 ...
- HIVE 命令记录
HIVE 命令记录 设置hive运行的队列 hive> set mapreduce.job.queuename=ven12; 打印列名 hive> set hive.cli.print.h ...
- 配置 Sybase数据源
1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory ...
- iis 7.5 ftp site用户名不能是 'ftp'?
在windows server 2008 r2上配置一个iis ftp site,创建了一个名为 ftp 的账号,并添加到允许规则中,可总是出现: Connected to ***.***.***.* ...
- (2)dotnet开源电商系统-brnshop VS nopCommerce(dotnet两套电商来PK--第二篇:代码从哪开始-BrnMall3.0Beta)
看大牛们的源码,对于水平一般的人,还是略微有点难度的.我从我自身读码的亲身体验,写下杂散片语,希望能和大家一同进步,也为了日后记忆上的备查. 先看的是brnMall的源码结构,从哪看起呢? 首先推荐看 ...
- 学习Spider 了解 Scrapy的流程
Scrapy 先创建项目 在windows下 scrapy startproject myproject #myproject是你的项目名称 cd 项目名称 scrapy g ...
- 洛谷P1616 疯狂的采药【完全背包】
题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说 ...
- 3分钟实现小程序唤起微信支付 Laravel教程
微信支付的接入,如果不使用成熟的开发包,将是巨大的工作量. 依赖 EasyWechat 先在 laravel 项目中依赖 easywechat 这个包 composer require "o ...
- 4.IntelliJ Idea 常用快捷键
IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Sh ...