题解 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\]

然后我们发现右边\(\sum_{i = 1}^{n}i \times\lfloor \frac{k}{i} \rfloor\)这个东西不是很好求,跑去现学整除分块,我们发现\(\lfloor \frac{k}{i} \rfloor\)这个东西是可以分成很多块,每一块内的\(\lfloor \frac{k}{i} \rfloor\)是不变的,我们将其提出,就是一个等差数列求和了

对于一个左端点为\(l\),对于\(\lfloor \frac{k}{i} \rfloor\)分块的块,其右端点为\(r = \lfloor \frac{k}{\lfloor \frac{k}{l} \rfloor} \rfloor\),假如\(\lfloor \frac{k}{l} \rfloor = 0\)那么\(r = n\)(至于怎么证明这玩意儿我还真不会)

程序就很好写了,注意\(r\)不能超过\(n\)

代码:

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

原文地址:https://www.cnblogs.com/colazcy/p/11515120.html

时间: 2024-10-07 20:12:14

题解 P2261 【[CQOI2007]余数求和】的相关文章

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

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

[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 输出样例

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

1257: [CQOI2007]余数之和sum

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2001  Solved: 928[Submit][Status] 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 mod 4 + 3