【题解】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 p, x = 10, n, m, k, base, skipper; 

LL Get_sum()//高斯求和,从p项开始公差为x
{
    int y = x - 1;
    int base = (k % p);
    int end = max(base % y, base - (m - p) * y);
    skipper = ((base - end) / y) + 1;
    return ((LL)(base + end) * (LL)skipper) >> 1;
}

void init()//分段设x值
{
    if(k > 1000000) x = 1555;
    else if(k > 5000000) x = 600;
    else if(k > 300000) x = 100;
    else if(k > 5000) x = 50;
    else x = 2;
}

signed main()
{
    scanf("%lld%lld", &n, &k);
    m = min(n, k);
    init();
    for(p = 1; p <= m; p ++)
    {
        if(p == (k / x) + 1)
        {
            ans += Get_sum();
            p += (skipper - 1);//统计加了多少项
            x -= 1;
        }
        else ans += (k % p);
    }
    if(n > k) ans += (LL) (n - k) * (LL) (k);
    printf("%lld", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/twilight-sx/p/8469347.html

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

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

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

[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]余数求和

题目背景 数学题,无背景 题目描述 给出正整数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 /

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

[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