【LG5171Earthquake】

题面

洛谷

题解

本题需要用到类欧几里得算法。

前置知识:类欧几里得

就是求函数$$\varphi (a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac {ai+b}c\right\rfloor$$

的值(其实还有两种形式,但是我还不会这里不做介绍)。

它的几何意义是直线\(y=\frac {ax+b}c\)在\([0,n]\)下方或过直线的第一象限内的整点数

令\(\xi(i)=\lfloor\frac {ai+b}c\rfloor\),

由结论\(\lfloor\frac{Ax}y\rfloor = \lfloor\frac{A(x\;\bmod\;y)}y\rfloor + A\lfloor\frac xy\rfloor\),

可以得到

\[\begin{aligned}
\xi(i)&=\left\lfloor\frac{ai}c+\frac bc\right\rfloor
\\&=\left\lfloor\frac{(a\bmod c)i+(b\bmod c)} c\right\rfloor+i\Big\lfloor\frac ac\Big\rfloor+\Big\lfloor\frac bc\Big\rfloor
\end{aligned}
\]

然后可以得到\(\varphi(a,b,c,n)=\varphi(a\bmod c,b\bmod c, c, n)+\frac {n(n+1)}2\lfloor\frac ac\rfloor+(n+1)\lfloor\frac bc\rfloor\)。

现在我们将\(\xi(i)\)的值限制在了\([0,n]\)之内,考虑将\(\varphi\)用新的式子表示出来:

\[\begin{aligned}
\varphi(a,b,c,n)&=\sum_{i=0}^n\sum_{d=1}^{\lfloor\frac {an+b}c\rfloor}\left[\lfloor\frac {ai+b}c\rfloor\geq d\right]\\&=\sum_{i=0}^n\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}\left[a^{-1}c\lfloor\frac {ai+b}c\rfloor\geq a^{-1}c(d+1)>a^{-1}(cd+c-1)\right]\\&=\sum_{i=0}^n\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}\left[i>\frac {cd+c-b-1}{a}\right]
\end{aligned}
\]

而右边艾弗森括号里的相当于统计有多少个数大于\(\frac {cd+c-b-1}{a}\),就相当于\(n-\lfloor\frac {cd+c-b-1}{a}\rfloor\),那么

\[\begin{aligned}
\varphi(a,b,c,n)&=\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}(n-\left\lfloor\frac {cd+c-b-1}{a}\right\rfloor)\\
&=n\left\lfloor\frac {an+b}c\right\rfloor-\sum_{d=0}^{\lfloor\frac {an+b}c\rfloor-1}\left\lfloor\frac {cd+c-b-1}{a}\right\rfloor\\
&=n\left\lfloor\frac {an+b}c\right\rfloor-\varphi(c,c-b-1,a,\left\lfloor\frac {an+b}c\right\rfloor-1)\\
&=n\left\lfloor\frac {an+b}c\right\rfloor-\varphi(c,c-b-1,a,\xi(n)-1)
\end{aligned}
\]

现在就可以递归处理了,至于复杂度,仔细思考一下发现和\(\gcd\)复杂度一样,为\(O(\log n)\)。

代码实现:

long long f(long long a, long long b, long long c, long long n) {
if (!a) return b / c * (n + 1);
else if (a >= c || b >= c) return f(a % c, b % c, c, n) + n * (n + 1) / 2 * (a / c) + (n + 1) * (b / c);
else {
long long m = (a * n + b) / c;
return n * m - f(c, c - b - 1, a, m - 1);
}
}

关于此题

\[ax+by-c\leq 0
\]

就是求\(y=\frac {c-ax}{b}\)下方或过直线在第一象限及正半轴上的整点数。

令\(n=\lfloor\frac ca\rfloor\),那么两端的点就为\((0,\frac cb),(n,\frac {c-an}b)\)。

显然可以把两端的\(y\)值调换一下,那么两点变为\((0,\frac {c-an}b),(n,\frac cb)\),

此时这条直线变为\(y=\frac ab x+\frac {c-an}{b}=\frac {ax+(c\;\bmod\;a)}b\),然后套到类欧的模板里再加上坐标轴上的贡献即可。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
long long a, b, c;
long long f(long long a, long long b, long long c, long long n) {
if (!a) return b / c * (n + 1);
else if (a >= c || b >= c) return f(a % c, b % c, c, n) + n * (n + 1) / 2 * (a / c) + (n + 1) * (b / c);
else {
long long m = (a * n + b) / c;
return n * m - f(c, c - b - 1, a, m - 1);
}
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
cin >> a >> b >> c;
printf("%lld\n", f(a, c % a, b, c / a) + c / a + 1);
return 0;
}

【LG5171】Earthquake的更多相关文章

  1. 【LuoguP5171】Earthquake

    题目链接 题意 求满足如下不等式的非负整数 \(x,y\) 的对数 \[ax+by\leq c\] Sol a,b,c 都是非负的,那么先随便变个形: \[y\leq\frac{c-ax}{b}\] ...

  2. 【BZOJ】1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害

    [题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点未被删除且不能到达结点1,求最少的删除点个数. [算法]最小割 [题解]本题和1的区别是:1求的是最少的不能到达1的结点数,那么就把损 ...

  3. 【BZOJ1585】【Luogu2944】地震损失2(网络流)

    [BZOJ1585][Luogu2944]地震损失2(网络流) 题面 题目描述 Wisconsin has had an earthquake that has struck Farmer John' ...

  4. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  5. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  6. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  9. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

随机推荐

  1. JAVA 运行springboot jar包设置classpath

    Java 命令行提供了如何扩展bootStrap 级别class的简单方法. -Xbootclasspath: 完全取代基本核心的Java class 搜索路径.不常用,否则要重新写所有Java 核心 ...

  2. python3 消耗CPU的性能,使CPU满载(可以设置进程名称)

    需要安装库:setproctitle    1.1.10,设置进程名称,测试操作系统centos 7.0 # -*- coding: utf-8 -*- from multiprocessing im ...

  3. 1+x证书Web前端开发CSS3详细教程

    web 前端开发之 CSS3 新特性 http://blog.zh66.club/index.php/archives/189/ web 前端开发之 html5 新特性 http://blog.zh6 ...

  4. Expression Tree上手指南 (一)【转】

    大家可能都知道Expression Tree是.NET 3.5引入的新增功能.不少朋友们已经听说过这一特性,但还没来得及了解.看看博客园里的老赵等诸多牛人,将Expression Tree玩得眼花缭乱 ...

  5. 阿里开源 KT Connnect,轻量级云原生测试环境治理平台来啦!

    作者| 阿里云技术专家 郑云龙(砧木) 目前越来越多的开发者开始采纳 Kubernetes 管理基础设施环境,并通过 Kubernetes 完成日常的开发,测试以及生产发布活动,为了能够有效的帮助开发 ...

  6. 如何当上Leader和六千个bug的系统

    在昨天的读书会上我分享了我是如何当上leader以及当上leader之后的体会.然后今天Sophie总结了我的发言,大家对此有些反馈.我根据大家的反馈写了这篇文章,主要针对几点: 大家如何当上lead ...

  7. War 包部署

    Springboot 进行war包部署,以及踩坑历险!!! https://www.jianshu.com/p/4c2f27809571 Springboot2项目配置(热部署+war+外部tomca ...

  8. Winform中设置ZedGraph因设置小刻度导致的竖直虚线显示过多

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  9. SATA、PCIe、AHCI、NVMe

    IT 界总喜欢发明新名词.而且同一个东西,可能有几个不同的名字.同一个名字,又可能指不同的东西. 从物理接口角度来说,我们常见的有IDE(淘汰),SATA,PCIe,M.2(固态硬盘) M.2插槽是有 ...

  10. Angular i18n(国际化方案)

    一.引言 i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无 ...