擴充套件歐幾里得和同餘

2022-09-11 01:03:19 字數 4237 閱讀 4717

bézout's identity(裴蜀定理):給予二整數 $a$ 與 $b$, 必存在有整數 $x$ 與 $y$ 使得$ax + by = gcd(a,b)$。

擴充套件歐幾里得演算法:給予二整數 $a$ 與 $b$, 必存在有整數 $x$ 與 $y$ 使得$ax + by = gcd(a,b)$。有兩個數$a,b$,對它們進行輾轉相除法,可得它們的最大公約數——這是眾所周知的。然後,收集輾轉相除法中產生的式子,倒回去,可以得到$ax+by=gcd(a,b)$的整數解。

1

int exgcd(int a, int b, int &x, int &y)28

int d = exgcd(b, a %b, y, x);

9 y -= a / b *x;

10return

d;11 }

①當$b = 0$的時候,$ax = gcd(a, 0) = a$。所以這時候取$x = 1, y = 0$即可,並將a返回。

②這裡取個巧將$x, y$交換一下位置,公式變為$by + (a mod b)x = d$。($d$為$gcd(a,b)$)

$by + (a\;mod \; b)x = d \leftrightarrow   by +(a - \lfloor \frac \rfloor b)x = d\leftrightarrow ax+b(y-\lfloor \frac \rfloor x) = d$

同餘方程:

$ax\equiv b\left ( mod\;m \right )\leftrightarrow ax = my + b\leftrightarrow ax - my = b\leftrightarrow ax+my' = b$

該公式有解的條件就是$b\; mod\; d == 0$。其中$d$是$gcd(a, m)$,即$b$是最大公約數的倍數就有解,否則無解。

acwing 202.最幸運的數字

由題目,

$l\mid 88\cdot \cdot \cdot 8\leftrightarrow l\mid 8*11\cdot \cdot \cdot 1\leftrightarrow l\mid8*\frac\leftrightarrow l\mid 8*\frac-1}

\leftrightarrow \frac\mid -1}$,其中$d = gcd(l,8)$,意義為兩邊都除去8的質因子。如果左邊沒有,就不除,而右邊除掉後依舊等價。

將$\frac$看做乙個常數$c$,轉換為求乙個最小的$x$使得$10^\equiv 1\left ( mod\;c \right )$

由尤拉定理,有$a^\equiv 1\left ( mod\;n \right )$,其中滿足$gcd(a,n)= 1$。

首先,$10$和$c$必然互質,否則餘數不可能為$1$, 所以如果$10$和$c$不互質,無解。

其次,我們可以知道所求的$x$必然是$phi(c)$的乙個約數。

證明:假設$x$是滿足$10^\equiv 1\left ( mod\;c \right )$的最小數且不是$phi(c)$的約數,而尤拉定理也滿足$10^\equiv 1\left ( mod\;c \right )$,那麼設$phi(c) = qx + r, 0有$10^\equiv 1\left ( mod\;c \right )$,因為$10^\equiv 1\left ( mod\;c \right )$,所以$10^\equiv 1\left ( mod\;c \right )$,所以得出$10^\equiv 1\left ( mod\;c \right )$,就找到了乙個比$x$更小的滿足$10^\equiv 1\left ( mod\;c \right )$的數,矛盾,所以$x$一定是$phi(c)$的乙個約數。

又因為$x$要取最小,所以$x$一定是$phi(c)$的最小約數。

所以本題需要求尤拉函式,求出$c$的尤拉函式,對其約數進行列舉,然後用快速冪判斷。

需要注意的是,該題的資料很大,相乘過程中會爆掉long long,所以快速冪進行相乘的時候要使用龜速乘,防止溢位。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;

78 typedef long

long

ll;9

10ll qmul(ll a, ll b, ll c)

1119

return

res;20}

2122

ll qmi(ll a, ll b, ll c)

2331

return

res;32}

3334

ll get_euler(ll n)

3544}45

if(n > 1)res = res / n * (n - 1

);46

return

res;47}

4849

intmain()

73 printf("

case %d: %lld\n

", t ++, res);74}

7576

77return0;

78 }

中國剩餘定理:

$m_1,m_2,m_3,m_4,\cdot \cdot \cdot m_k$兩兩互質。

$\left\x\equiv a_1\left ( mod\;m_1 \right )

& \\ x\equiv a_2\left ( mod\;m_2 \right )

& \\ x\equiv a_3\left ( mod\;m_3 \right )

& \\ \cdot \cdot \cdot

& \\ \cdot \cdot \cdot

& \\ x\equiv a_k\left ( mod\;m_k \right )

& \end\right.$

$m = m_1m_2m_3\cdot \cdot \cdot m_k$

$m_i = \frac, t_i$是$m_i$模$m_i$的逆

即$m_i*t_i\equiv 1\left ( mod\;m_i \right )$

$x=a_1\cdot m_1\cdot t_1+a_2\cdot m_2\cdot t_2+a_1\cdot m_3\cdot t_3+\cdot \cdot \cdot +a_k\cdot m_k\cdot t_k$

acwing 1298.曹沖養豬

由題,$x\equiv b[i]\left ( mod \;a[i] \right )$

答案$x=b[1]\cdot m_1\cdot t_1+b[2]\cdot m_2\cdot t_2+b[3]\cdot m_3\cdot t_3+\cdot \cdot \cdot +b[k]\cdot m_k\cdot t_k$

其中,$m = a[1]* a[2]* a[3]\cdot \cdot \cdot a[k],m_i = \frac$。

所以現在需要求得$t_i$,由 $m_i*t_i\equiv 1\left ( mod\;a[i] \right )\leftrightarrow m_i*t_i - a[i]*x = 1\leftrightarrow m_i*t_i+a[i]*x' = 1$,通過拓展歐幾里得演算法,可求出$t_i$。

迭代到最後求得答案。

1 #include 2 #include 3

4using

namespace

std;

56 typedef long

long

ll;7

8const

int n = 11;9

10int

a[n], b[n];

11int

n;12

13 ll exgcd(ll a, ll b, ll &x, ll &y)

1420 ll d = exgcd(b, a %b, y, x);

21 y -= a / b *x;

22return

d;23}24

25int

main()

3334 ll res = 0;35

for(int i = 0 ; i < n ; i ++)

3642

43 cout << (res % m + m) % m <44return0;

45 }

和與餘數的和同餘理解 模和同餘定理

一 什麼是餘數 在整數的除法中,只有能整除與不能整除兩種情況。當不能整除時,就產生餘數。我們在讀小學二年級時,已經學了帶餘數的出發了,我們來溫習一下。通過做了這麼多年除法,我們可以理解到,餘數是指整數除法中被除數未被除盡部分,且餘數的取值範圍為0到除數之間 不包括除數 的整數,也就是說餘數一定比除數...

和與餘數的和同餘理解 餘數與同餘問題

餘數 在公 中,我們常常利用同餘性質計算週期問題 已知某天 餘數同餘問題 1 用乙個自然數去除另乙個自然數,不完全商是 8,餘數是 16,被除數 除數 商 餘數 這四個數的和為 463,那麼除數為 2 57 96 148 被某自然數整除,餘數相同,且不為零,那麼 284 被這個自然數除后餘 3 15...

和與餘數的和同餘理解 公考備考 餘數同餘問題不再怕

行測數量關係是大家比較棘手的乙個模組,題難的很大乙個方面也在於題目涉及題型之廣,出題型別類似於小於奧數,需要被考察著很強的邏輯思維能力,那麼在數量關係中有一種題型叫做餘數問題,這類題型看似很複雜,無從下手,但是當我們掌握了餘數同餘問題的解題方式之後,以後再遇到類似問題就迎刃而解了。下面我們一起來了解...