zoukankan      html  css  js  c++  java
  • [学习笔记]类欧几里得

    类欧几里得旨在处理一类问题:
    即和直线下整数点有关问题。
    \(f(a,b,c,n) = \sum_{i = 0}^n\lfloor\frac{ai + b}{c}\rfloor\)

    我们先考虑\(a > c,b > c\)我们先对其进行取膜

    \(f(a,b,c,n) \\= \sum_{i = 0}^n\lfloor\frac{ai + b}{c}\rfloor\\=\sum\lfloor\frac{(\lfloor{\frac{a}{c}}\rfloor * c + a\ mod\ c) \times i + (\lfloor{\frac{b}{c}}\rfloor * c + b\ mod\ c)}{c}\rfloor\\=\frac{n(n + 1)}{2}\lfloor\frac{a}{c}\rfloor + (n + 1)\lfloor\frac{b}{c}\rfloor + f(a\ mod\ c,b\ mod\ c,c,n)\)

    考虑转化贡献:

    \(= \sum_{j = 0}^{\lfloor\frac{an + b}{c}\rfloor - 1}\sum_{i = 0}^n [j < \lfloor\frac{ai + b}{c}\rfloor]\)

    接下来是最关键的一步,我们转换条件
    \(\lfloor\frac{ai + b}{c}\rfloor \to j + 1\leq \frac{ai + b}{c}\)

    在做变换有
    \(\lfloor\frac{ai + b}{c}\rfloor \to j + 1\leq \frac{ai + b}{c}\to jc + c \leq ai + b \to jc + c - b - 1 < ai\)

    所以有\(\lfloor\frac{jc + c - b - 1} {a}\rfloor < i\)
    \(m = \lfloor\frac{an + b}{c}\rfloor\)
    所以改柿子为\(f(a,b,c,n) = \sum_{j = 0}^{m - 1}\sum_{i = 0}^n[i > \lfloor\frac{jc + c - b - 1} {a}\rfloor]\)

    所以有\(= \sum_{j = 0}^{m - 1}(n - \lfloor\frac{jc + c - b - 1}{a}\rfloor) = nm - f(c,c - b - 1,a,m - 1)\)

    于是我们发现其变成了一个辗转相乘的的形式,有类似于欧几里得。其为\(O(logn)\)

    我们还可以思考下列两个变种式,但是由于我太懒了,不太想打\(LaTex\),我找时间把我手写的拍上来。

    \(g(a,b,c,n) = \sum_{i = 0}^n i \lfloor\frac{ai + b}{c}\rfloor\)

    \(h(a,b,c,n) = \sum_{i = 0}^n ( \lfloor\frac{ai + b}{c}\rfloor) ^ 2\)

    因为万欧比较好写,所以可能不会实现该类欧做法,下次遇到万欧不能做的再放题上来吧。

  • 相关阅读:
    leetcode_09_Palindrome Number (easy)
    JQuery与JavaScript与Ajax三者的区别与联系
    Blockly常用函数
    JavaWeb中四大域对象
    Thymeleaf知识
    列表、字典、元组、集合的区别
    Spring Boot拦截器
    AWS路由表
    Android调试工具DDMS的使用详解
    Android 列表单选对话框
  • 原文地址:https://www.cnblogs.com/dixiao/p/15719048.html
Copyright © 2011-2022 走看看