当前位置: 首页 > news >正文

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

传送门


首先知道这个式子是不能暴力的 ∑ i = 1 n k   m o d   i \sum_{i=1}^nk~mod~i i=1nk mod i

根据取模的定义,我们可以化简:

∑ i = 1 n k   m o d   i = ∑ i = 1 n k − i ∗ ⌊ k i ⌋ = ∑ i = 1 n k − ∑ i = 1 n i ∗ ⌊ k i ⌋ \sum_{i=1}^nk~mod~i=\sum_{i=1}^nk-i*⌊\frac{k}{i}⌋=\sum_{i=1}^nk-\sum_{i=1}^ni*⌊\frac{k}{i}⌋ i=1nk mod i=i=1nkiik=i=1nki=1niik

看到 ∑ i = 1 n ⌊ k i ⌋ \sum_{i=1}^n⌊\frac{k}{i}⌋ i=1nik很容易想到整除分块,但我们单纯的求出来的只是每一块的和,实际上每一块都是连续的,相当于是 i ∗ ( l + ( l + 1 ) + . . . + r ) i*(l+(l+1)+...+r) i(l+(l+1)+...+r),然后用等差数列的公式求和即可: ( k / l ) ∗ ( r − l + 1 ) ∗ ( l + r ) / 2 (k/l)*(r-l+1)*(l+r)/2 (k/l)(rl+1)(l+r)/2

然后就是整除分块中需要注意的边界问题,因为 n n n是有可能大于 k k k的,因此如果到后面 l > k l>k l>k k / l = 0 k/l=0 k/l=0,必须结束枚举,那么就是直接令 r = n r=n r=n

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <bitset>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define Vector Point
#define lowbit(x) (x&(-x))
#define mkp(x,y) make_pair(x,y)
#define mem(a,x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const double dinf=1e300;
const ll INF=1e18;
const int Mod=998244353;
const int maxn=2e5+10;

ull n,k;

ull cal(){
    ull ans=0;
    for(ull l=1,r;l<=n;l=r+1){
        if(k/l) r=min(k/(k/l),n);  
        else r=n;  //注意
        ans+=(k/l)*(r-l+1)*(l+r)/2;
    }
    return ans;
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>k;
    //for(int i=1;i<=n;i++) cout<<k/i<<endl;
    cout<<n*k-cal()<<endl;
    return 0;
}

相关文章:

  • 如何定义一本好书——《程序员羊皮卷》书评(2)
  • Win32 OpenGL编程(10) 视口变换
  • SQL SERVER 的 CLR 存储过程
  • 有用的Oracle 管理工具 for windows助手
  • 现代软件构建系统的使用 CMake简介
  • 搜集的一些RTMP项目,有Server端也有Client端
  • .NET的数据绑定
  • 从员工、猎头到创业者的职场经验——《程序员羊皮卷》书
  • 完成从学习者到社会人的转变——《程序员羊皮卷》连载(14)
  • 百度全面放弃竞价排名的原因
  • Mobile Market如何能像淘宝网一样流行?
  • Ubuntu 9.10总算出来了
  • 《程序员羊皮卷》还未上市即告售罄的故事
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • 翻阅笔记所得杂记若干
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 03Go 类型总结
  • 11111111
  • avalon2.2的VM生成过程
  • bearychat的java client
  • create-react-app项目添加less配置
  • Django 博客开发教程 16 - 统计文章阅读量
  • Flannel解读
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • javascript数组去重/查找/插入/删除
  • k8s如何管理Pod
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Node 版本管理
  • Python实现BT种子转化为磁力链接【实战】
  • scrapy学习之路4(itemloder的使用)
  • SQL 难点解决:记录的引用
  • 阿里研究院入选中国企业智库系统影响力榜
  • 基于web的全景—— Pannellum小试
  • 记一次删除Git记录中的大文件的过程
  • 物联网链路协议
  • 正则表达式小结
  • NLPIR智能语义技术让大数据挖掘更简单
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​flutter 代码混淆
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $NOIp2018$劝退记
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (8)STL算法之替换
  • (C++17) optional的使用
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (安卓)跳转应用市场APP详情页的方式
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在