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