數學基礎 2


數學基礎

前言

又回來整理 前面學的都忘干凈了...

大多數(或者是全部)定理只有結論 不涉及證明 代碼如果可以的話后面會補充


由於不分篇目的原因 內容勢必會非常雜亂 但是應該不會分開寫了 反正也沒人看


前面其實已經有數學基礎1了 這是 2 寫的原因是上一遍和沒學差不多

所以有些東西是重復的

或許后面還會有 3 或者 4 什么的 也有可能繼續在這個后面寫


3 寫不動了 受限於個人水平 有些東西學不會 理解能力跟不上了 所以開4了(霧


平衡三進制

對稱三進制 不標准的計數體系 數字由 -1, 0, 1 構成 基數為 3z 代替 -1

0    0
1    1
2    1Z
3    10
4    11
5    1ZZ

-1   Z
-2   Z1
-3   Z0
-4   ZZ
-5   Z11

負數即為將正數的數字倒轉 負數最高位為 z 正數最高位為 1

轉換

先將一個數表示為 3 進制 從最低位開始迭代 跳過任何的 01 遇到 2 時將其變為 z 下一位的數字加 1 遇到 3 變為 0 下一位數字加 1

平衡三進制具有唯一性

一些符號

\([x]\) 表示 \(x\) 下取整

\(p_k\) 表示第 \(k\) 個素數

\(\pi(x)\) 表示 \(1-\)x 范圍內的素數個數

\(\mu(x)\) 表示莫比烏斯函數

\(\#S\) 表示 \(S\) 集合的大小

\(\delta(x)\) 表示 \(x\) 的最小質因子

\(P^+(n)\) 表示 \(x\) 的最大質因子

雖然並沒有什么用就是了

素數

定義

如果一個數 除了 \(1\) 和它本身外 無其他因子 這個數被稱為質數 否則稱為合數

\[\pi(x) \approx \frac{x}{\ln x} \]

\(1\) 既不是素數也不是合數

質因數分解

定義 任何一個大於 \(1\) 的正整數都能被唯一分解為有限個質數的乘積 寫作:

\[N = p_1^{c_1}p_2^{c_2}...p_m^{c_m} \]

  • 唯一分解定理

    對於某一正整數 \(n\) 其質因數分解的方式是唯一的

  • 正整數除法
    將 被除數 與 除數 先進行質因數分解 再將對應每個素數的指數相減

\[\begin{array} & & 24 \div 8\\ = & (2 ^ 3 \times 3 ^ 1) \div 2^3\\ = & 2^{3 - 3} \times 3^{1 - 0}\\ = & 3 \end{array} \]

\(m \mid n\)

\(n \div m = p_1^{a_1 - b_1} p_2^{a_2 - b_2}...p_m^{a_m - b_m}\)

滿足 \(a_1 \geq b_1, a_2 \geq b_2 , ...\)

驗證 \(n\) 是否可以被 \(m\) 整除 比較兩數質因數分解后的各項質數

素數判定

試除法

不斷嘗試小於 \(x\) 且大於 \(1\) 的自然數 只要有一個能整除 \(x\)\(x\) 為合數 否則 \(x\) 是素數

由於約數都是成對存在的 所以只需嘗試 \([1, \sqrt x]\) 即可

篩法求素數

埃氏篩

復雜度 \(O(n\log ^2n)\)

對於枚舉的數 枚舉其倍數 並且將其倍數標記為合數

一個數會被其所有因子篩一遍 造成時間上的浪費 至於優化

歐拉篩(線篩)

復雜度 \(O(n)\)

思路與埃篩基本相同 但是保證了每個數只被其最小質因子篩一遍 對於枚舉的數 \(i\) 如果其之前沒有被標記 將其即為質數 然后枚舉其質數倍 將其倍數標記為合數 在 \(i \mod 第j個素數 = 0\) 時 結束枚舉

費馬小定理

如果 \(p\) 為質數 有整數 \(a\)\(a \bot p\)\(a^{p - 1} \equiv 1 \mod p\)

與歐拉定理的關系

\(p\) 為質數時

\[\varphi(p) = p - 1 \]

此時的歐拉定理可寫為

\[a^{\varphi(p)} \equiv 1 \mod p\\ a_{p - 1} \equiv 1 \mod p \]

即 費馬小定理

費馬小定理即歐拉定理中 \(p\) 為質數時的特殊情況

二次探測定理

\(p\) 為質數 且 \(x^2 \equiv 1 \mod p\)

那么 \(x \equiv 1 \mod p\)\(x \equiv p - 1\mod p\) 中的一個成立

\(p \mid (x + 1)(x - 1)\)


約數

定義

如果 \(a \mid b\)\(a\)\(b\) 的約數 \(b\)\(a\) 的倍數

特別地 任何數都是 \(0\) 的約數

一般地 有 \(1 \mid a\)\(a \mid a\)\(1\), \(a\)\(a\) 的平凡因子

約數的幾種求法

  • 試除法

    枚舉 \([1, \sqrt n]\) 中所有整數 進行試除 判斷 \(n\) 能否整除

  • 優化

    當求 \([1, n]\) 中所有數的約數時 上面的試除法復雜度就變成了 \(O(n \sqrt n)\)

    \(1\)\(n\) 中一一個數 \(x\) 為約數的數 \(x, 2x, 3x, ..., \lfloor \frac nx \rfloor \times x\) 枚舉到 \(x\) 的時候 枚舉 \(x\) 的倍數 使他們的約數加上一個 \(x\)

    復雜度 \(O(n\log n)\)

對任意數 \(n\) 求約數個數

根據 \(n = p_1^{c_1}p_2^{c_2}...p_m^{c_m}\)

通項公式: \(num = \sum_{i = 1}^m(c_i + 1)\)

對任意數 \(n\) 求約數和

通項公式: \(sum = \prod_{i = 1}^m\sum_{j = 0}^{c_i}p_i^j\)


最大公約數 與 最小公倍數

最大公約數

定義 : 有 \(n\), \(m\) 兩整數 \(n, m\) 的最大公約數 \(d\) 滿足 \(d \mid n\)\(d \mid m\) 的最大的 \(d\) 記作 \(d = \gcd(n, m)\) 簡寫為 \((n, m)\)

\(n = p_1^{a_1}p_2^{a_2}...p_k^{a_k}, m = p_1^{b_1}p_2^{b_2}...p_k^{b_k}\)

\(d = p_1^{\min \{a_1, b_1 \}}p_2^{\min \{a_2, b_2 \}}...p_k^{\min \{a_k, b_k \}}\)

最小公倍數

定義 : 有 \(n\), \(m\) 兩整數 \(n, m\) 的最小公倍數 \(l\) 滿足 \(n \mid l\)\(m \mid l\) 的最小的 \(l\) 記作 \(l = lcm(n, m)\) 簡寫為 \([n, m]\)

\(l = d = p_1^{\max \{a_1, b_1 \}}p_2^{\max \{a_2, b_2 \}}...p_k^{\max \{a_k, b_k \}}\)

另 有 \((n, m) \times [n, m] = nm\)


互質

定義 : 若 \(\gcd(a, b) = 1\)\(a, b\) 互質 記為 \(a \bot b\)

即: 當 \(a, b\) 進行質因數分解之后 沒有相等的質因數

性質 :

  • 對於兩個不同的質數 \(m, n\)\(\gcd(n, m) = 1\)
  • 對於任意相鄰的整數 \(n, m\)\(\gcd(n, m) = 1\)
  • 對任意自然數 \(n\)\(\gcd(n, 1) = 1\)
  • 一個質數 \(m\) 和一個合數 \(n\)\(m \nmid n\)\(\gcd(n, m) = 1\)

歐拉函數

定義 : 對正整數 \(n\) 滿足 \(a \bot n\) \(a < n\)\(a\) 的個數 即為 \(n\) 的歐拉函數的值 記作 \(\varphi(n)\)

性質:

  1. \(\varphi(1) = 1\)
  2. \(\varphi(p) = p - 1\)
  3. \(n \bot m\)\(\varphi(nm) = \varphi(n)\varphi(m)\)
  4. \(n\) 為奇數 \(\varphi(2n) = \varphi(n)\)
  5. \(\varphi(p^a) = p^a(1 - \frac 1p)\)
  6. 對任意大於 \(1\) 的正整數 \(n\)\(\varphi(n) = n\prod_{i = 1}^n(1 - \frac 1{p_i})\)

對 5 :

\(p^a\) 小的數有 \(p^a - 1\) 個 與 \(p^a\) 不互質的數 一定是 \(p\) 的倍數 \(p\) 的倍數可以表示為 \(tp, t \in [1, p_{a - 1} - 1]\)

\(p\) 互質的數的個數:

\(\varphi(p^a) \\ = (p^a - 1) - (p^{a - 1} - 1) \\ = p^a - p^{a - 1} \\ = p^{a - 1}(p - 1) \\ = p^a(1 - \frac 1p)\)

對 6 :

\(n = p_1^{c_1}p_2^{c_2}...p_k^{c_k}\)

\(\varphi(n) \\ = \varphi(p_1^{c_1}p_2^{c_2}...p_k^{c_k}) \\ = \varphi(p_1^{c_1})\varphi(p_2^{c_2})...\varphi(p_k^{c_k}) \\ = p_1^{c_1}(1 - \frac 1{p_1})p_2^{c_2}(1 - \frac 1{p_2})...p_k^{c_k}(1 - \frac 1{p_k}) \\ = (p_1^{c_1}p_2^{c_2}...p_k^{c_k}) \times (1 - \frac 1{p_1})(1 - \frac 1{p_2})...(1 - \frac 1{p_k}) \\ = n\prod_{i - 1}^n(1 - \frac 1{p_i})\)

歐拉函數篩(咕)

眾所周知 有個叫歐拉函數篩的東西 還有歐拉線篩 可以在篩質數的時候順便篩一下歐拉函數 這里先咕着 后面補

記着這個在 1 里面是有的

歐拉定理

對於兩個互質的數 \(a, p\)\(a^{\varphi(p)} \equiv 1 \mod p\)


關於同余的一些概念

  1. 反身性: \(a \equiv a \mod m\)
  2. 對稱性: 若 \(a \equiv b \mod m\)\(b \equiv a \mod m\)
  3. 傳遞性: 若 \(a \equiv b \mod m\)\(b \equiv c \mod m\)\(a \equiv c \mod m\)
  4. \(a \equiv b \mod m, c \equiv d \mod m\)\(a \pm c \equiv b \pm d \mod m\)
  5. \(a \equiv b \mod m, c \equiv d \mod m\)\(ac \equiv bd \mod m\)
  6. \(a \equiv b \mod m, n \in N\)\(a^n \equiv b^n \mod m\)
  7. \(ac \equiv bd \mod m\)\(a \equiv b \mod \frac m{(c, m)}\)\((c, m) = 1\)\(a \equiv b \mod m\)
  8. \(a \equiv b \mod m_i, i = 1, 2, ..., k\)\(a \equiv b \mod [m_1, m_2, ..., m_k]\)

歐幾里得與擴展歐幾里得

歐幾里得定理

\(\gcd(a, b) = \gcd(b, a \% b)\)\(b = 0\) 時 有 \(\gcd(a, b) = |a|\)

應用: 可以方便的求 \((a, b)\)

int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}

裴蜀定理

\(a, b\) 為不全為 \(0\) 的整數 則存在 \(x, y\) 使 \(ax + by = \gcd(a, b)\)

特別的 當 \(\gcd(a, b) = 1\) 則 存在 \(x, y\) 使 \(ax + by = 1\)

題目: 裴蜀定理

大概是定理的推廣形式

代碼

/*
  Time: 6.19
  Worker: Blank_space
  Source: P4549 【模板】裴蜀定理
*/
/*--------------------------------------------*/
#include<cstdio>
#define Abs(x) ((x) < 0 ? -(x) : (x))
/*--------------------------------------頭文件*/
int n, ans;
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
	return x * f;
}
/*----------------------------------------快讀*/
int gcd(int _a, int _b) {return _b ? gcd(_b, _a % _b) : _a;}
/*----------------------------------------函數*/
int main() {
	n = read(); ans = read(); ans = Abs(ans);
	for(int i = 2, x; i <= n; i++) x = read(), ans = gcd(ans, Abs(x));
	printf("%d", ans);
	return 0;
}

擴展歐幾里得

對於不完全為 \(0\) 的兩個數 \(a, b\) 必然存在無數個 \(x, y\) 使方程 \(ax + by = \gcd(a, b)\) 成立

求特殊解:

void exgcd(int a, int b, int &d, int &x, int &y) {
    if(b) exgcd(b, a % b, d, y, x), y -= x * (a / b);
    else d = a, x = 1, y = 0;
}

應用:

  1. 求解不定方程
  2. 求解同余方程
  3. 求解模的逆元
  4. 求解同余方程組

對 1:

對方程 \(ax + by = c\)

不定方程 \(ax + by = \gcd(a, b)\) 有無數組解

\(\gcd(a, b) \nmid c\) 則原方程無解

\(\gcd(a, b) \mid c\)\(d = \gcd(a, b)\)

原方程可轉化為 \(a(x \times \frac dc) + b(y\times \frac dc) = c\times \frac dc\)

\(x_1 = x \times \frac dc, y_1 = y \times \frac dc\)

\(ax_1 + by_1 = d\) 求解該方程得 \(x_1, y_1\)

得: \(x = x_1 \times \frac cd, y = y_1 \times \frac cd\)

既得原方程的解

對 2:

\(ax \equiv c \mod b \to ax + nb = c + mb\)

\(ax + (n - m)b = c\) 求解該不定方程所得 \(x\) 即為原方程的解

但是這不一定是最小正整數解

x = (x + b) % b;

題目: 同余方程

代碼

/*
  Time: 6.19
  Worker: Blank_space
  Source: P1082 [NOIP2012 提高組] 同余方程
*/
/*--------------------------------------------*/
#include<cstdio>
#define int long long
/*--------------------------------------頭文件*/
inline void File() {
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
}
/*----------------------------------------文件*/
int a, b, d, x, y;
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
	return x * f;
}
/*----------------------------------------快讀*/
void exgcd(int _a, int _b, int &_d, int &_x, int &_y) {
	if(_b) exgcd(_b, _a % _b, _d, _y, _x), _y -= _x * (_a / _b);
	else _d = _a, _x = 1, _y = 0;
}
/*----------------------------------------函數*/
signed main() {
	a = read(); b = read(); exgcd(a, b, d, x, y); x /= d; printf("%lld", (x % b + b) % b);
	return 0;
}

對 3:

適用於模數不為質數的情況

即解: \(x \times inv(x) \equiv 1 \mod p\)

\(a = x, x = inv(x)\)\(ax \equiv 1 \mod p\)

對 4:

解如下方程組:

\(\begin{cases}x \equiv a_1 \mod b_1 \\ x \equiv a_2 \mod b_2 \\ ... \\ x \equiv a_n \mod b_n \end{cases}\)

其中 \(a, b\) 為非負整數 不保證模數互質

求解:

使用 \(exgcd\) 對同余方程進行合並

假設當前已經求出了前 \(k - 1\) 個方程的解 \(x_{k - 1}\)\(M = lcm_{i = 1}^{k - 1}b_i\)

即前 \(k - 1\) 個方程的通解為 \(x_{k - 1} + tM\) 現在目標是使第 \(k\) 個方程的解為前 \(k - 1\) 個方程的通解的同時也滿足第 \(k\) 個方程的條件 設 \(x_k = x_{k - 1} + tM\)\(x_{k - 1} + tM \equiv a_k \mod b_k\) 顯然 該方程是可解的 得 \(t\) 的值 則可求 \(x_k = x_{k - 1} + tM\) 經過 \(n\) 次操作后 即得原方程組的解

代碼:(數據較大 龜速乘)

/*
  Time: 6.19
  Worker: Blank_space
  Source: P4777 【模板】擴展中國剩余定理(EXCRT)
*/
/*--------------------------------------------*/
#include<cstdio>
#define int long long
/*--------------------------------------頭文件*/
inline void File() {
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
}
/*----------------------------------------文件*/
int n, M, ans, d, x, y;
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
	return x * f;
}
/*----------------------------------------快讀*/
int mul(int _a, int _b, int mod, int res = 0) {for(; _b; _a = (_a + _a) % mod, _b >>= 1) if(_b & 1) res = (res + _a) % mod; return res;}
void exgcd(int _a, int _b, int &_d, int &_x, int &_y) {
	if(_b) exgcd(_b, _a % _b, _d, _y, _x), _y -= _x * (_a / _b);
	else _d = _a, _x = 1, _y = 0;
}
/*----------------------------------------函數*/
signed main() {
	n = read(); M = read(); ans = read();
	for(int i = 2; i <= n; i++)
	{
		int b = read(), a = read(); a = ((a - ans) % b + b) % b;
		exgcd(M, b, d, x, y); if(a % d) {puts("-1"); return 0;}
		x = mul(x, a / d, b); ans += x * M; M = M / d * b; ans = (ans % M + M) % M;
	}
	printf("%lld", ans);
	return 0;
}


乘法逆元

對於在模意義下的除法 對模數 \(p\) 和除數 \(x\) 往往可以找到一個特殊的數 \(y\) 用 $ \times y$ 代替 \(\div x\)\(y\) 記作 \(x\) 的逆元 記作 \(inv(x)\)

通過定義: \(x \times inv(x) \equiv 1 \mod p\)

求解逆元

這里本來有四種方法 但是由於太懶 所以變成了三種

  1. 費馬小定理

    只適用於模數為質數的情況 這是最常用的一種 因為大多數題目的模數都會設為質數(不是刻意卡的話)

    費馬小定理: \(x^{p - 1} \equiv 1 \mod p\)

    故有: \(x^{p - 1} \equiv x \times inv(x) \mod p\)

    兩側同除 \(x\) 有: \(inv(x) \equiv x^{p - 2} \mod p\)

    所以快速冪直接求 \((x^{p - 2}) \% p\) 即為 \(\div x\)\(p\) 意義下的逆元

  2. 遞推

    只適用於模數為質數的情況 如果要求的逆元數量很多而且連續 就可以使用遞推

    \(inv(i) = -\lfloor \frac pi \rfloor \times inv(p \% i) \% p\)

    正確性:

    \(p = ik + r\)

    \(p \equiv 0 \mod p\)

    \(ik + r \equiv 0 \mod p\)

    兩邊同乘 \(inv(i)inv(r)\)

    \(i \times inv(i) \times k \times inv(r) + r \times inv(r) \times inv(i) \equiv 0 \mod p\) 化簡 得 \(k \times inv(r) + inv(i) \equiv 0 \mod p\)

    \(inv(i) \equiv -k \times inv(r) \mod p\)

    \(inv(i) \equiv -\lfloor \frac pi \rfloor \times inv(p \% i) \mod p\)

    但是是求最小正整數解 加個 \(p\) 調一下

    \(inv(i) = (p - \lfloor \frac pi \rfloor) \times inv(p \% i) \% p\)

  3. 擴展歐幾里得

    模數可以不為質數

    由逆元的定義 \(x \times inv(x) \equiv 1 \mod p\)

    把這個東西當做同余方程來解就好了

題目: 乘法逆元

這個題目適合用線性求逆元

代碼

/*
  Time: 6.19
  Worker: Blank_space
  Source: P3811 【模板】乘法逆元
*/
/*--------------------------------------------*/
#include<cstdio>
#define int long long 
/*--------------------------------------頭文件*/
const int C = 1e6 + 7;
/*------------------------------------常量定義*/
inline void File() {
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
}
/*----------------------------------------文件*/
int n, p, inv[C << 2];
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
	return x * f;
}
/*----------------------------------------快讀*/

/*----------------------------------------函數*/
signed main() {
	n = read(); p = read(); inv[1] = 1;
	for(int i = 2; i <= n; i++) inv[i] = (p - p / i) * inv[p % i] % p;
	for(int i = 1; i <= n; i++) printf("%lld\n", inv[i]);
	return 0;
}

題目: 有理數取余

看一眼 高精!?

高個鬼 要模數干啥的

費馬小定理的寫法

代碼

/*
  Time: 6.19
  Worker: Blank_space
  Source: P2613 【模板】有理數取余
*/
/*--------------------------------------------*/
#include<cstdio>
#define int long long
/*--------------------------------------頭文件*/
const int mod = 19260817;
/*------------------------------------常量定義*/
int a, b;
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = ((x << 3) + (x << 1) + (ch ^ 48)) % mod; ch = getchar();}
	return x * f;
}
/*----------------------------------------快讀*/
int power(int _a, int _b, int res = 1) {for(; _b; _a = _a * _a % mod, _b >>= 1) if(_b & 1) res = res * _a % mod; return res;}
/*----------------------------------------函數*/
signed main() {
	a = read(); b = read(); printf("%lld", a * power(b, mod - 2) % mod);
	return 0;
}
//話說為什么這個代碼能過啊...
//感覺數據范圍會炸的可以看一眼快讀
//數據里面好像並沒有無解的數據點

擴展歐幾里得的寫法

代碼

/*
  Time: 6.19
  Worker: Blank_space
  Source: P2613 【模板】有理數取余
*/
/*--------------------------------------------*/
#include<cstdio>
#define int long long
/*--------------------------------------頭文件*/
const int mod = 19260817;
/*------------------------------------常量定義*/
int a, b, d, x, y;
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {x = ((x << 3) + (x << 1) + (ch ^ 48)) % mod; ch = getchar();}
	return x * f;
}
/*----------------------------------------快讀*/
void exgcd(int _a, int _b, int &_d, int &_x, int &_y) {
	if(_b) exgcd(_b, _a % _b, _d, _y, _x), _y -= _x * (_a / _b);
	else _d = _a, _x = 1, _y = 0;
}
/*----------------------------------------函數*/
signed main() {
	a = read(); b = read(); exgcd(b, mod, d, x, y); x /= d; x = (x % mod + mod) % mod; printf("%lld", a * x % mod);
	return 0;
}


擴展歐拉定理

\(p\) 意義下 對於 \(a^b\)

\(a^b \equiv \begin{cases}a^b & b < \varphi(p) \\ a^{b\ mod\ \varphi(p) + \varphi(p)} & b \geq \varphi(p) \end{cases}\)

眾所周知 有一個叫歐拉篩的東西 雖然對這個題並沒有什么用

題目: 擴展歐拉定理

很驚喜的發現 \(b\) 后面跟着一大坨令人惡心的東西 然后又發現直接篩歐拉函數復雜度就會爆炸 但是這里只需要求一個數的歐拉函數值 根據前面 \(\varphi(n) = n\prod(1 - \frac 1{p_i})\) 考慮對 \(n\) 質因數分解 直接試除

代碼

/*
  Time: 6.19
  Worker: Blank_space
  Source: P5091 【模板】擴展歐拉定理
*/
/*--------------------------------------------*/
#include<cstdio>
#define int long long
/*--------------------------------------頭文件*/
const int INF = 1e14;
/*------------------------------------常量定義*/
inline void File() {
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
}
/*----------------------------------------文件*/
int a, b, m, phi = INF, ans = 1;
bool flag;
/*------------------------------------變量定義*/
inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		if(x >= phi) flag = 1, x %= phi; ch = getchar();
	}
	return x * f;
}
/*----------------------------------------快讀*/
int power(int _a, int _b, int res = 1) {for(; _b; _a = _a * _a % m, _b >>= 1) if(_b & 1) res = res * _a % m; return res;}
/*----------------------------------------函數*/
signed main() {
	a = read(); m = read(); phi = m; int tmp = m;
	for(int i = 2; i * i <= m; i++) if(!(tmp % i))
	{
		phi -= phi / i;
		while(!(tmp % i)) tmp /= i;
	}
	if(tmp > 1) phi -= phi / tmp; b = read() + flag * phi;
	printf("%lld", power(a, b));
	return 0;
}

題目: 上帝與集合的正確用法(待完成)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM