Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

    • 一些小问题
    • 二次剩余学习笔记
    • 卡特兰数学习笔记
    • 同余最短路学习笔记
    • 康托展开学习笔记
    • 快速傅里叶变换学习笔记
    • 拉格朗日插值学习笔记
    • 拓展欧几里得学习笔记
    • 斐波那契数列学习笔记
    • 斯特林数笔记
    • 本原勾股数组学习笔记
    • 模运算学习笔记
    • 欧拉函数
    • 类欧几里得学习笔记
      • 引入 51Nod 1187
      • 例题 洛谷P5170
        • 1. 求$\sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor$
        • 2. 求$\sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor^{2}$
        • 3. 求$\sum_{i=0}^{n} i\left\lfloor\frac{a i+b}{c}\right\rfloor$
      • 51Nod 1187
    • 素性检测与大数分解
    • 素数计数问题
    • 组合数问题
    • 高斯整数学习笔记
  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

类欧几里得学习笔记

# 类欧几里得

类欧几里得只是复杂度同欧几里得相似,跟欧几里得没有关系。

# 引入 51Nod 1187

给出 a,b,c,da,b,c,da,b,c,d, 找一个分数p/qp/qp/q,使得a/b<p/q<c/da/b < p/q < c/da/b<p/q<c/d,并且qqq最小。例如:1/31/31/3同1/21/21/2之间,符合条件且分母最小的分数是2/52/52/5。(如果qqq相同,输出ppp最小的)(1≤a,b,c,d≤109)(1 \le a,b,c,d \le 10^9)(1≤a,b,c,d≤109)

下面进行分类讨论

  1. 当a=0a=0a=0(递归边界1)

    由于q>pdcq>p\frac{d}{c}q>pcd​,显然有p=1,q=d/c+1p=1,q=d/c+1p=1,q=d/c+1

  2. 当a≥ba\ge ba≥b

    可以对不等式两边同时减去⌊ab⌋\lfloor\frac{a}{b}\rfloor⌊ba​⌋,转化为情况1/3/41/3/41/3/4

  3. 当a<b,c>da<b,c>da<b,c>d(递归边界2)

    显然有p=1,q=1p=1,q=1p=1,q=1

  4. 其他情况

    对不等式两边求倒数,得dc<qp<ba\frac{d}{c}<\frac{q}{p}<\frac{b}{a}cd​<pq​<ab​,且d≥cd\ge cd≥c,转化为情况222

AC代码

看了上面的例题,聪明的你一定会了吧?不妨来做一下下面这道例题。

# 例题 洛谷P5170 (opens new window)

给定 n,a,b,c,n, a, b, c,n,a,b,c, 分别求 ∑i=0n⌊ai+bc⌋,∑i=0n⌊ai+bc⌋2,∑i=0ni⌊ai+bc⌋\sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor, \sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor^{2}, \sum_{i=0}^{n} i\left\lfloor\frac{a i+b}{c}\right\rfloor∑i=0n​⌊cai+b​⌋,∑i=0n​⌊cai+b​⌋2,∑i=0n​i⌊cai+b​⌋ 答案对 998244353 取模。

# 1. 求∑i=0n⌊ai+bc⌋\sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor∑i=0n​⌊cai+b​⌋

令f(a,b,c,n)=∑i=0n⌊ai+bc⌋f(a,b,c,n)=\sum\limits_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloorf(a,b,c,n)=i=0∑n​⌊cai+b​⌋

# 1.1 当a≥ca\ge ca≥c或b≥cb\ge cb≥c

f(a,b,c,n)=∑i=0n⌊ai+bc⌋=∑i=0n⌊(a%c)i+b%cc⌋+n(n+1)2⌊ac⌋+(n+1)⌊bc⌋=f(a%c,b%c,c,n)+n(n+1)2⌊ac⌋+(n+1)⌊bc⌋\begin{aligned}f(a,b,c,n) &= \sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor\\&=\sum_{i=0}^{n}\left\lfloor\frac{(a\%c)i+b\%c}{c}\right\rfloor+\frac{n(n+1)}{2}\lfloor\frac{a}{c}\rfloor+(n+1)\lfloor\frac{b}{c}\rfloor\\&=f(a\%c,b\%c,c,n)+\frac{n(n+1)}{2}\lfloor\frac{a}{c}\rfloor+(n+1)\lfloor\frac{b}{c}\rfloor\end{aligned} f(a,b,c,n)​=i=0∑n​⌊cai+b​⌋=i=0∑n​⌊c(a%c)i+b%c​⌋+2n(n+1)​⌊ca​⌋+(n+1)⌊cb​⌋=f(a%c,b%c,c,n)+2n(n+1)​⌊ca​⌋+(n+1)⌊cb​⌋​

转化为a<c,b<ca<c,b<ca<c,b<c的情况

# 1.2 当a<c,b<ca<c,b<ca<c,b<c

f(a,b,c,n)=∑i=0n⌊ai+bc⌋=∑i=0n∑j=1⌊ai+bc⌋1=∑j=1⌊an+bc⌋∑i=0n[j≤⌊ai+bc⌋]\begin{aligned}f(a,b,c,n)&=\sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor\\&=\sum_{i=0}^{n}\sum_{j=1}^{\lfloor\frac{a i+b}{c}\rfloor}1\\&=\sum_{j=1}^{\lfloor\frac{an+b}{c}\rfloor}\sum_{i=0}^{n}\left[j\le\lfloor\frac{ai+b}{c}\rfloor\right]\end{aligned} f(a,b,c,n)​=i=0∑n​⌊cai+b​⌋=i=0∑n​j=1∑⌊cai+b​⌋​1=j=1∑⌊can+b​⌋​i=0∑n​[j≤⌊cai+b​⌋]​

式(2)(2)(2)中的方括号为艾佛森括号,当条件成立时值为111,否则为000.

对不等式进行变换

j≤⌊ai+bc⌋↔j≤ai+bc↔jc≤ai+b↔jc−b−1<aij\le\lfloor\frac{ai+b}{c}\rfloor\leftrightarrow j\le\frac{ai+b}{c}\leftrightarrow jc\le ai+b\leftrightarrow jc-b-1<ai j≤⌊cai+b​⌋↔j≤cai+b​↔jc≤ai+b↔jc−b−1<ai

再次下取整

jc−b−1a<i↔⌊jc−b−1a⌋<i\frac{jc-b-1}{a}<i \leftrightarrow\left\lfloor\frac{jc-b-1}{a}\right\rfloor<i ajc−b−1​<i↔⌊ajc−b−1​⌋<i

继续对原式进行化简

f(a,b,c,n)=∑j=1⌊an+bc⌋∑i=0n[i>⌊jc−b−1a⌋]=∑j=1⌊an+bc⌋(n−⌊jc−b−1a⌋)=n⌊an+bc⌋−∑j=1⌊an+bc⌋⌊jc−b−1a⌋=n⌊an+bc⌋−∑j=0⌊an+bc⌋−1⌊jc+c−b−1a⌋=n⌊an+bc⌋−f(c,c−b−1,a,⌊an+bc⌋−1)\begin{aligned}f(a,b,c,n) & = \sum_{j=1}^{\lfloor\frac{an+b}{c}\rfloor}\sum_{i=0}^{n}\left[i>\left\lfloor\frac{jc-b-1}{a}\right\rfloor\right]\\&=\sum_{j=1}^{\lfloor\frac{an+b}{c}\rfloor}\left(n-\left\lfloor\frac{jc-b-1}{a}\right\rfloor\right)\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-\sum_{j=1}^{\lfloor\frac{an+b}{c}\rfloor}\left\lfloor\frac{jc-b-1}{a}\right\rfloor\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-\sum_{j=0}^{\lfloor\frac{an+b}{c}\rfloor-1}\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\\&=n\left\lfloor\frac{an+b}{c}\right\rfloor-f(c,c-b-1,a,\left\lfloor\frac{an+b}{c}\right\rfloor-1)\end{aligned} f(a,b,c,n)​=j=1∑⌊can+b​⌋​i=0∑n​[i>⌊ajc−b−1​⌋]=j=1∑⌊can+b​⌋​(n−⌊ajc−b−1​⌋)=n⌊can+b​⌋−j=1∑⌊can+b​⌋​⌊ajc−b−1​⌋=n⌊can+b​⌋−j=0∑⌊can+b​⌋−1​⌊ajc+c−b−1​⌋=n⌊can+b​⌋−f(c,c−b−1,a,⌊can+b​⌋−1)​

上面的公式巨长,巨难写

式(1)(1)(1)到式(2)(2)(2)的转换:核心是通过限制转移,使得jjj不受iii限制。

式(3)(3)(3)到式(4)(4)(4)的转换:∑i=0n[i>⌊jc−b−1a⌋]\sum\limits_{i=0}^{n}\left[i>\left\lfloor\frac{jc-b-1}{a}\right\rfloor\right]i=0∑n​[i>⌊ajc−b−1​⌋]实质上是统计大于⌊jc−b−1a⌋\left\lfloor\frac{jc-b-1}{a}\right\rfloor⌊ajc−b−1​⌋的iii的个数,可以改写作n−⌊jc−b−1a⌋n-\left\lfloor\frac{jc-b-1}{a}\right\rfloorn−⌊ajc−b−1​⌋

使用式(5)(5)(5)进行递归求解,当a=0a=0a=0时,f(a,b,c,n)=(n+1)⌊bc⌋f(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloorf(a,b,c,n)=(n+1)⌊cb​⌋

# 2. 求∑i=0n⌊ai+bc⌋2\sum_{i=0}^{n}\left\lfloor\frac{a i+b}{c}\right\rfloor^{2}∑i=0n​⌊cai+b​⌋2

NUF9OS.png

# 3. 求∑i=0ni⌊ai+bc⌋\sum_{i=0}^{n} i\left\lfloor\frac{a i+b}{c}\right\rfloor∑i=0n​i⌊cai+b​⌋

NUF9OS.png

# 万能欧几里得

NUF9OS.png

# AC代码

# 51Nod 1187

#include <bits/stdc++.h>
#define Android ios::sync_with_stdio(false), cin.tie(NULL)

using namespace std;

void calc(int a, int b, int c, int d, int & p, int & q){
    if(a == 0){
        p = 1, q = d / c + 1;
    } else if(a >= b){
        int delta = a / b;
        calc(a%b, b, c - d*delta, d, p, q);
        p += q * delta;
    }else if(c > d){
        p = q = 1;
    }else{
        calc(d, c, b, a, q, p);
    }
}

void solve(){
    int a, b, c, d, p, q, g;
    cin >> a >> b >> c >> d;
    calc(a, b, c, d, p, q);
    g = __gcd(p, q);
    cout << p / g << "/" << q / g << "\n";
}

signed main(){
    Android;
    int t; cin >> t;
    while(t--) solve();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
上次更新: 2021/02/24, 03:37:30
欧拉函数
素性检测与大数分解

← 欧拉函数 素性检测与大数分解→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式