题目大意

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

解析

整除分块的一个典型例子。

整除分块解决的是形如

\[\sum^n_{i=1} ~ \lfloor\frac{n}{i}\rfloor
\]

的问题,其复杂度为\(O(\sqrt{n})\)。

实际上是规律性的一类问题,打表可以发现对于一些连续的\(i\),\(\lfloor\frac{n}{i}\rfloor\)具有相同的值。具体而言,对于一个\(i\),在一个区间\(i\sim \lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor\)中,\(\lfloor\frac{n}{i}\rfloor\)具有相同的值。

也就是说,对于这个问题,我们只需要把整除分块中每一块的和累加就行了。

回到这道题,把题意转化为数学语言

\[\sum_{i=1}^n ~ k \mod i
\]

根据模算术的定义,可以写成

\[\sum_{i=1}^n ~ k-\lfloor\frac{k}{i}\rfloor*i
\]

\[n*k-\sum_{i=1}^n ~ \lfloor\frac{k}{i}\rfloor*i
\]

后面的东西就是整除分块,对于一个块\(l\sim r\),有

\[(r-l+1)*k-(r-l+1)\lfloor\frac{k}{i}\rfloor*\sum_{i=l}^r ~ i
\]

所以对于一个块,\(\sum_{i=l}^r ~ i\) 实际上是一个等差数列,我们一并求出来就可以了。

参考代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define ll long long
using namespace std;
ll n,k;
int main()
{
scanf("%d%d",&n,&k);
ll tmp=0;
for(int l=1,r=0;l<=n;l=r+1){
if(!(k/l)) r=n;
else r=min(k/(k/l),n);
tmp+=(r-l+1)*(k/l)*(l+r)/2;
}
printf("%lld\n",n*k-tmp);
return 0;
}

P2261 [CQOI2007]余数求和[整除分块]的更多相关文章

  1. 洛谷 P2261 [CQOI2007]余数求和 ||整除(数论)分块

    参考:题解 令f(i)=k%i,[p]表示不大于p的最大整数f(i)=k%i=k-[k/i]*i令q=[k/i]f(i)=k-qi如果k/(i+1)=k/i=qf(i+1)=k-q(i+1)=k-qi ...

  2. 洛谷P2261 [CQOI2007] 余数求和 [数论分块]

    题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...

  3. [CQOI2007] 余数求和 - 整除分块

    \(\sum_{i=1}^n\;k\;mod\;i\) Solution \(\sum_{i=1}^n\;k\;mod\;i\\=\sum_{i=1}^n(k-i\lfloor{\frac{k}{i} ...

  4. LUOGU P2261 [CQOI2007]余数求和(数论分块)

    传送门 解题思路 数论分块,首先将 \(k\%a\) 变成 \(k-a*\left\lfloor\dfrac{k}{a}\right\rfloor\)形式,那么\(\sum\limits_{i=1}^ ...

  5. P2261 [CQOI2007]余数求和 【整除分块】

    一.题面 P2261 [CQOI2007]余数求和 二.分析 参考文章:click here 对于整除分块,最重要的是弄清楚怎样求的分得的每个块的范围. 假设$ n = 10 ,k = 5 $ $$  ...

  6. 洛谷 P2261 [CQOI2007]余数求和 解题报告

    P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...

  7. Bzoj 1257 [CQOI2007]余数之和 (整除分块)

    Bzoj 1257 [CQOI2007]余数之和 (整除分块) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 一道简单题. 题目 ...

  8. 洛谷——P2261 [CQOI2007]余数求和

    P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...

  9. [Luogu P2261] [CQOI2007]余数求和 (取模计算)

    题面 传送门:https://www.luogu.org/problemnew/show/P2261 Solution 这题显然有一个O(n)的直接计算法,60分到手. 接下来我们就可以拿出草稿纸推一 ...

随机推荐

  1. 【Java语言特性学习之一】设计模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  2. H5混合开发中android终端和ios终端常见的兼容问题1

    转自 https://blog.csdn.net/xuehu837769474/article/details/80603898 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上 ...

  3. 从GitLab上创建分支本地拉取项目和提交项目详解

    很多公司前端项目都是部署在GitLab上的,今天我要分享的就是如何从GitLab上创建新的分支并在本地拉取和提交项目 一.在GitLab上面创建自己新的分支 首先你得注册一个账号,登陆之后进入项目Pr ...

  4. [转帖]GNU, Free Software and Open Source 自由软件与开源软件

    GNU, Free Software and Open Source 自由软件与开源软件 https://blog.csdn.net/icycolawater/article/details/7792 ...

  5. linux虚拟机IP发生变化之后上面Oracle数据库的处理

    1. 首先说明一下 centos 和 rhel 的关系 redhat是最大的开源软件公司(现在已经被IBM收购) 作为开源最大的受益者,  redhat 自己的 rhel(redhat enterpr ...

  6. mysql中数据表记录的增删查改(1)

    数据记录的增删改查 insert into `数据表名称` (`字段名称`, ...) values ('1', ...); delete from `数据表名称` where 子句; update ...

  7. python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)

    12.324 Django ORM常用字段 .id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True.当model ...

  8. Sql日期查询-SQL查询今天、昨天、7天内、30天

    今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * from 表名 where ...

  9. centos7简单部署rancher

    rancher官网文档地址 https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/ 准备机器 两台虚拟机 192.168.56.100 192 ...

  10. Thread 与 ThreadLocal

    @Testpublic void testThread() { Thread thread = Thread.currentThread(); System.out.println("thr ...