數學基礎
前言
又回來整理 前面學的都忘干凈了...
大多數(或者是全部)定理只有結論 不涉及證明 代碼如果可以的話后面會補充
由於不分篇目的原因 內容勢必會非常雜亂 但是應該不會分開寫了 反正也沒人看
前面其實已經有數學基礎1了 這是 2
寫的原因是上一遍和沒學差不多
所以有些東西是重復的
或許后面還會有 3
或者 4
什么的 也有可能繼續在這個后面寫
3
寫不動了 受限於個人水平 有些東西學不會 理解能力跟不上了 所以開4了(霧
平衡三進制
對稱三進制 不標准的計數體系 數字由 -1
, 0
, 1
構成 基數為 3
用 z
代替 -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
進制 從最低位開始迭代 跳過任何的 0
和 1
遇到 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\) 和它本身外 無其他因子 這個數被稱為質數 否則稱為合數
\(1\) 既不是素數也不是合數
質因數分解
定義 任何一個大於 \(1\) 的正整數都能被唯一分解為有限個質數的乘積 寫作:
-
唯一分解定理
對於某一正整數 \(n\) 其質因數分解的方式是唯一的
-
正整數除法
將 被除數 與 除數 先進行質因數分解 再將對應每個素數的指數相減
有
若 \(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\) 為質數時
此時的歐拉定理可寫為
即 費馬小定理
費馬小定理即歐拉定理中 \(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)\)
性質:
- \(\varphi(1) = 1\)
- \(\varphi(p) = p - 1\)
- 若 \(n \bot m\) 則 \(\varphi(nm) = \varphi(n)\varphi(m)\)
- 當 \(n\) 為奇數 \(\varphi(2n) = \varphi(n)\)
- \(\varphi(p^a) = p^a(1 - \frac 1p)\)
- 對任意大於 \(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\)
關於同余的一些概念
- 反身性: \(a \equiv a \mod m\)
- 對稱性: 若 \(a \equiv b \mod m\) 則 \(b \equiv a \mod m\)
- 傳遞性: 若 \(a \equiv b \mod m\) 且 \(b \equiv c \mod m\) 則 \(a \equiv c \mod m\)
- 若 \(a \equiv b \mod m, c \equiv d \mod m\) 則 \(a \pm c \equiv b \pm d \mod m\)
- 若 \(a \equiv b \mod m, c \equiv d \mod m\) 則 \(ac \equiv bd \mod m\)
- 若 \(a \equiv b \mod m, n \in N\) 則 \(a^n \equiv b^n \mod m\)
- 若 \(ac \equiv bd \mod m\) 則 \(a \equiv b \mod \frac m{(c, m)}\) 當 \((c, m) = 1\) 時 \(a \equiv b \mod m\)
- 若 \(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:
對方程 \(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\)
求解逆元
這里本來有四種方法 但是由於太懶 所以變成了三種
-
費馬小定理
只適用於模數為質數的情況 這是最常用的一種 因為大多數題目的模數都會設為質數(不是刻意卡的話)
費馬小定理: \(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\) 意義下的逆元
-
遞推
只適用於模數為質數的情況 如果要求的逆元數量很多而且連續 就可以使用遞推
\(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\)
-
擴展歐幾里得
模數可以不為質數
由逆元的定義 \(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;
}
題目: 上帝與集合的正確用法(待完成)