首页 > 其他分享 >欧拉函数、整除分块和扩展欧几里得

欧拉函数、整除分块和扩展欧几里得

时间:2024-05-16 17:30:30浏览次数:23  
标签:lfloor frac gcd 分块 cdot varphi rfloor 整除 欧拉

欧拉函数

欧拉函数(写作 \(\varphi(x)\)),表示 \(i\in[1,x] 且 \gcd(i,x)=1\) 的 \(i\) 的数量。

乍一看好像很难求,但我们先考虑最简单的情况,即 \(x\in \mathbb{P}\) (\(\mathbb{P}\) 表示质数集) 的情况。

首先很容易看出 \(\varphi(x)=x-1\),因为 \(x\in \mathbb{P}\),所以 \(\forall i \in [1,x-1]\) 都有 \(\gcd (i,x)=1\)。

接着,我们可以想到 \(\varphi (x^2)=x^2-x\),因为总共 \(x^2\) 个数,\(x\) 的倍数都不合法,总共 \(\frac{x^2}{x}=x\) 个 \(x\) 的倍数。

继续,\(\varphi (x^3)=x^3-x^2\),因为总共 \(x^3\) 个数,\(x\) 的倍数都不合法,总共 \(\frac{x^3}{x}=x^2\) 个 \(x\) 的倍数。

$\vdots $

最终,我们可以得到 \(\forall k \ge 1,\varphi (x^k)=x^k-x^{k-1}=(x-1)x^{k-1}\)。

接着,我们来考虑这个问题:当 \(\gcd(a,b)=1\) 时,\(\varphi(a\cdot b)=\varphi(a)\cdot\varphi(b)\)。(即证欧拉函数是积性函数)

我们来感性理解一下,对于所有 \(x\le a且\gcd(x,a)=1\) 的数 \(x\) 和 \(y \le b 且 \gcd(y,b)=1\) 的 \(y\),那么 \(\gcd(x\cdot y,a\cdot b)=1\),因为 \(x\) 的质因子 \(a\) 都没有,\(y\) 的质因子 \(b\) 也都没有,所以相乘后仍然没有。即每个 \(x\cdot y\) 为一个合法的数,所以 \(\varphi(a\cdot b)=\varphi (a)\cdot \varphi(b)\)。

接下来我们就可以求解 \(\varphi(x)\) 了。

方法1

这种方法可以 \(O(\sqrt x)\) 求出一个单独的 \(\varphi (x)\)。

首先我们可以把 \(x\) 拆成这样:\(x=p_1^{e_1}\cdot p_2^{e_2}\cdot p_3^{e_3}\cdot \cdots\)。

接着,通过 \(\varphi(a\cdot b)=\varphi(a)\cdot \varphi(b)\),我们可以将式子变成 \(\varphi(x)=\varphi (p_1^{e_1})\cdot \varphi(p_2^{e_2})\cdot \varphi(p_3^{e_3})\cdot \cdots\)

最终我们就可以得到 \(\varphi(x)=(p_1-1)\cdot p_1^{e_1-1}\cdot (p_2-1)\cdot p_2^{e_2-1}\cdot (p_3-1)\cdot p_3^{e_3-1}\cdot \cdots\)。而这段直接用分解质因数求解即可。

代码

int phi(int x) {
  int res = 1;
  for(int i = 2; i * i <= x; ++i) {
    if(x % i == 0) {
      x /= i, res *= i - 1;
      for(; x % i == 0; x /= i, res *= i) {
      }
    }
  }
  return res * (x > 1 ? x - 1 : 1);
}

phi(x);

方法2

这种方法可以 \(O(N)\) 求出 \(\forall x\in [1,N]\) 的 \(\varphi(x)\),并且欧拉筛及其相似。

首先我们可以直接在筛出质数时求解,并且可以找到一个数的最小质因子,而这种方法就是通过最小质因子求解的。

当枚举到质数 \(p\),倍数为 \(i\):

  • 如果 \(\gcd(p,i)=1\),那么 \(\varphi (p\cdot i)=\varphi(i)\cdot(p-1)\)。
  • 否则,\(\varphi(p \cdot i)=\varphi(i)\cdot p\),因为相当于让 \(p\) 的指数加一,所以答案乘以 \(p\)。

代码

int phi[MAXN];
vector<int> prime;

void C(int x) {
  phi[1] = 1;
  for(int i = 2; i <= x; ++i) {
    if(!phi[i]) {
      phi[i] = i - 1;
      prime.push_back(i);
    }
    for(int p : prime) {
      if(i * p > x) {
        break;
      }
      if(i % p == 0) {
        phi[i * p] = phi[i] * p;
        break;
      }
      phi[i * p] = phi[i] * phi[p];
    }
  }
}

C(n);

整除分块

整除分块,就是 \(O(\sqrt k)\) 求解类似于 \(\sum \limits_{i=1}^{N} \lfloor\frac{k}{i}\rfloor\) 的式子。

整除分块的主要思想就是枚举 \(\lfloor\frac{k}{i}\rfloor\) 的值,因为我们可以证明值的数量是 \(O(\sqrt k)\) 级别的:

  • 当 \(i \le \sqrt k\) 时,\(\lfloor \frac{k}{i} \rfloor\) 的数量很明显 \(\le \sqrt k\)。
  • 当 \(i > \sqrt k\) 时,\(\lfloor \frac{k}{i} \rfloor \le \sqrt k\),即 \(\lfloor \frac{k}{i} \rfloor\) 的数量 \(\le \sqrt k\)。

所以总共是 \(O(\sqrt k)\) 级别的。

假设我们知道一个值出现的最早位置为 \(l\),那么怎么求最后一个位置 \(r\) 呢?

\[\begin{array}{l} \lfloor \frac{k}{l}\rfloor=\lfloor \frac{k}{r}\rfloor\\ \lfloor \frac{k}{l}\rfloor \cdot r \le k\\ r \le \frac{k}{\lfloor \frac{k}{l}\rfloor},即r=\lfloor\frac{k}{\lfloor \frac{k}{l}\rfloor}\rfloor \end{array} \]

代码

int ans;

for(int l = 1, r = 1; l <= min(k, n); l = r + 1) {
   r = min(n, k / (k / l));
   ans += (k / l) * (r - l + 1);
}

扩展欧几里得

扩展欧几里得 \(O(\sqrt{\min(a,b)})\) 求出 \(ax+by=c\)(\(\gcd(a,b) | c\))的一组整数解。

直接开推(这里只考虑 \(c=\gcd(a,b)\) 的情况,其余情况将答案 \(\times k\) 即可):

\[\begin{array}{l} ax+by=\gcd(a,b)\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \Downarrow\\ b \cdot x' + (a-\lfloor\frac{a}{b}\rfloor \cdot b)\cdot y'=\gcd(b,a \bmod b)\\ b\cdot x'+a\cdot y'-\lfloor \frac{a}{b} \rfloor \cdot by'=\gcd(b,a \bmod b)\\ a\cdot y'+b\cdot (x'-\lfloor \frac{a}{b} \rfloor\cdot y')=\gcd(b,a \bmod b)\\ \therefore ax+by=\gcd(a,b)=a\cdot y'+b\cdot (x'-\lfloor \frac{a}{b} \rfloor\cdot y')\\ \therefore 当\begin{cases}x=y'\\y=(x'-\lfloor \frac{a}{b} \rfloor \cdot y')\end{cases} 时是一组合法的解。 \end{array} \]

只需按照上述方法不断操作直到 \(b=0\) 时即可。(当 \(b=0\) 时的一组解解为 \(\begin{cases}x=1\\y=0\end{cases}\))

代码

using pii = pair<int, int>;

pii exgcd(int a, int b) {
  if(!b) {
    return {1, 0};
  }
  auto [x, y] = exgcd(b, a % b);
  return {y, x - a / b * y};
}

标签:lfloor,frac,gcd,分块,cdot,varphi,rfloor,整除,欧拉
From: https://www.cnblogs.com/yaosicheng124/p/18196364

相关文章

  • 分块 学习笔记
    什么是分块分块,顾名思义是一种将数据分成多块,以实现一些功能的算法。分块算法实质上是一种是通过将数据分成多块后在每块上打标记以实现快速区间修改,区间查询的一种算法。其均摊时间复杂度为\(O(\sqrt{n})\)分块的具体操作分块voidcreate(){ t=sqrt(n); for(inti=1;i<......
  • 欧拉函数
    1欧拉函数的定义和性质欧拉函数定义:\(\varphi(n)\)定义为不超过\(n\)且与\(n\)互质的正整数的个数。\[\varphi(n)=\sum\limits_{i=1}^n[gcd(n,i)=1]\]例如,\(n=4\)时,有\(1,3\)与\(4\)互质,因此\(\varphi(4)=2\);\(n=9\)时,有\(1,2,4,5,7,8\)与\(9\)互质,因此\(\v......
  • 2024ICPC武汉邀请赛-G.Pack-数论分块、整除运算相关的不等式
    link:https://codeforces.com/gym/105143Groupcontests:https://codeforces.com/group/DWEH34LQgT/contest/521901题意:有\(n\)件\(A\)物品,\(m\)件\(B\)物品,两种物品价值分别是\(a,b\),若干件\(A\)和若干件\(B\)可以打包成一个商品,打包尽可能多的商品的情况下让剩余的......
  • 分块 - 树分块
    分块-树分块LuoguP3203[HNOI2010]弹飞绵羊经典的\(LCT\)板子题,十分滴规范,但我们今天不讲\(LCT\)我们用树分块这个俎法哈,又短又快的咩(好像不是很快哈,同学们要认真学习哈我们把一个点能到的点当成它的老子,那\(N+1\)就是根的咩显然它的编号越跳越大撒,我们就......
  • [分块] [Luogu AT_joisc2014_c] 历史研究
    题目描述IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记。JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件。日记中记录了连续\(N\)天发生的事件,大约每天发生一件。事件有种类之分。第\(i\)天发生的......
  • 分块=-=优雅的暴力=-=中位数模版
    #include<bits/stdc++.h>//#defineintlonglong#definelllonglong#definefd(i,a,b)for(registerinti=a;i<=b;i=-~i)#definebd(i,a,b)for(registerinti=a;i>=b;i=~-i)usingnamespacestd;constintN=1e5+509,M=509,MOD=10007;intn,siz,id;......
  • CF EDU164-E-数论分块
    link:https://codeforces.com/contest/1954/problem/E有一排怪物,第\(i\)只有\(a_i\)的血,每次攻击可以选择在\(i\)处放一个技能,技能会一直向左/右以相同的\(k\)点伤害扩散,直至遇到边界或已经死亡的怪物。问最少需要放几次技能?需要对所有\(k\)回答答案。\(n,a_i\leq10^......
  • 阿里云CTF逆向题“欧拉”详细Writeup
    题目来源:阿里云CTF题目类型:逆向题目描述:欧拉欧拉欧拉欧拉![attachment](Euler.exe)题目解析:使用IDA打开,F5,整体先看一遍,100多行,没有混淆先看变量定义这里:charStr1[16];//[rsp+20h][rbp-40h]BYREF__int128v21;//[rsp+30h][rbp-30h]__int128v22;//[rsp+40h][r......
  • 欧拉函数 整除分块 扩展欧几里得
    欧拉函数\(\varphi(x)\)表示求出\(1\ley\lex,\gcd(x,y)=1\)的\(y\)的数量。对于一个质数\(p\),\(\varphi(p)=p-1\)\(\varphi(p^2)=p^2-\frac{p^2}{p}=p^2-p\)\(\dots\)\(\varphi(p^i)=p^i-p^{i-1}=(p-1)\cdotp^{i-1}\)......
  • 欧拉函数
    欧拉函数\(phi_x\)表示\(1\)到\(x\)中的所有与\(x\)互质的数字数量性质:x为质数时,\(phi_x=x-1\),\(phi_{x^2}=p^2-p\),……\(phi_{x^k}=p^k-p^{k-1}=(p-1)\timesp^{k-1}\)当\(a,b\)互质时,\(phi_{a\timesb}=phi_a*phi_b\)做法:......