Luogu P2261 [CQOI2007]余数求和

最近中考放假几天都在怼一道BJOI2018的水题,但卡死在90pts跑不动啊!

然后今天发现终于过了然而Hack的数据全RE了然后就开始找新的题目来找回信心。

然后发现智能推荐里有这道题,然后想了1min才想到CQOI到底是哪里的原来是重庆呵

其实还是一道比较好的除法分块入门题。动一下脑子就可以做了。

我们先观察一下最基础的式子:

\(\sum_{i=1}^n k\ mod\ i\)

然后我们利用取余的基本性质,即\(k\ mod\ i=k-i\lfloor\frac{k}{i}\rfloor\),把原式化为:

\(\sum_{i=1}^n k-i\lfloor\frac{k}{i}\rfloor\),然后把k提取出来,即有\(nk-\sum_{i=1}^n i\lfloor\frac{k}{i}\rfloor\)

然后我们考虑如何求解\(\sum_{i=1}^n i\lfloor\frac{k}{i}\rfloor\),而求它的关键就在于这个\(\lfloor\frac{k}{i}\rfloor\)

我们令\(t=\lfloor\frac{k}{i}\rfloor\),然后我们通过样例\(k=5\)的情况来观察一下规律:

\(i\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\) \(9\) \(10\)
\(t\) \(5\) \(2\) \(1\) \(1\) \(1\) \(0\) \(0\) \(0\) \(0\) \(0\)

手玩找规律一下可以发现一个显然的性质所有的\(t\)都是连续的一段

然后我们考虑把所有相同的\(t\)都一起计算,这样我们可以估计它的复杂度大约为\(O(\sqrt n)\)

然后我们令我们当前处理的区间左端为\(l\),然后我们想一下如何推出\(r\)然后我们继续手玩发现

  • 当\(t=0\)时,\(r=0\)
  • 当\(t\ne 0\)时,\(r=min(n,\lfloor\frac{k}{t}\rfloor)\)

然后这样我们下一次操作只要使\(l=r+1\)即可

然后对于每一块内,我们计算它们的和:

\(sum=\frac{t\cdot (r-l+1)\cdot (l+r)}{2}\)

然后我们就做下去即可附上超级精简CODE

#include<cstdio>
using namespace std;
long long n,k,t,ans,l,r;
inline int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    scanf("%lld%lld",&n,&k); ans=n*k;
    for (l=1;l<=n;l=r+1)
    t=k/l,r=t?min(n,k/t):n,ans-=t*(r-l+1)*(l+r)>>1;
    printf("%lld",ans);
}

原文地址:https://www.cnblogs.com/cjjsb/p/9174894.html

时间: 2024-08-29 20:50:23

Luogu P2261 [CQOI2007]余数求和的相关文章

[Luogu 2261] CQOI2007 余数求和

[Luogu 2261] CQOI2007 余数求和 <题目链接> 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \(10^{9}\) 的范围注定会卡掉暴力. 所以我们要用除法分块来优化. 由题意得:\(ans = \sum_{i=1}^{n} k \bmod i\) 我们知道,\(a \bmod b = a - b \times \lfloor \frac{a}{b} \rfloor\) 因此,\

P2261 [CQOI2007]余数求和

题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29 输入输出格式 输入格式: 两个整数n k 输出格式: 答案 输入输出样例 输入样例#1: 10 5 输出样例

题解 P2261 【[CQOI2007]余数求和】

题目链接 Solution [CQOI2007]余数求和 题目大意:给定\(n,k\),求\(\sum_{i = 1}^{n}k \bmod i\) 解析:我们考虑大力化柿子 \[\sum_{i = 1}^{n}k \bmod i\] \[=\sum_{i = 1}^{n}k-i \times \lfloor \frac{k}{i} \rfloor\] \[=nk-\sum_{i = 1}^{n}i \times\lfloor \frac{k}{i} \rfloor\] 然后我们发现右边\(\s

【洛谷P2261】[CQOI2007]余数求和

题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值,其中k mod i表示k除以i的余数.例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 -- + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29 输入输出格式 输入格式: 两个整数n k 输出格式: 答案 输入输出样例 输入样例#1: 10 5 输出样例

【题解】CQOI2007余数求和

大家都说这题水然而我好像还是调了有一会儿--不过暴力真的很良心,裸的暴力竟然还有60分. 打一张表出来,就会发现数据好像哪里有规律的样子,再仔细看一看,就会发现k/3~k/2为公差为2的等差数列,k/2~之后为公差为1的等差数列,于是我们就可以利用高斯求和快速求解啦.自认为代码是能够看得的... #include <bits/stdc++.h> using namespace std; #define LL long long #define int long long LL ans; int

Luogu2261 [CQOI2007]余数求和

题目蓝链 Description 定义函数\(G(n, k) = \sum\limits_{i = 1}^{n} k~mod~i\),给定\(n, k\),求函数\(G\)的值 \(n, k \leq 10^9\) Solution 我一开始看这题的时候居然还懵了一下 因为当\(i > k\)时,余数一定都是\(k\),所以我们只需要考虑\(i \leq k\)的部分怎么求 我们可以把\(k\)表示成\(a \cdot i + b\)的形式,我们发现\(k\)分别整除\([1, k]\)之间的数

[CQOI2007]余数求和

[代码] #include<bits/stdc++.h> #define LL long long using namespace std; int main() { LL n, k, t, ans; #define LL long long scanf("%lld%lld", &n, &k); ans = (LL) n * k; for(LL l = 1,r; l <= n;l = r + 1) { r = (t = k / l) ? min(k /

[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

BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4474  Solved: 2083[Submit][Status][Discuss] Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3