diff --git a/Algorithms/stdbanner.h b/Algorithms/stdbanner.h new file mode 100644 index 0000000..c161c66 --- /dev/null +++ b/Algorithms/stdbanner.h @@ -0,0 +1,116 @@ +/* + :Zu + iB@B@i iGM; + i@@B@@@B2 7B@B@B@. + @@@@B@B@B@u iM@B@B@B@BL + B@B@N OB@@@BY F@@@B@BMM@B@O + E@B@B .O@B@B@: :BB@@@B@0U7FB@B@ + :@B@B. .@B@B@O YB@B@B@OSYJjuU@B@B + @B@B5 rB@B@B7 u@B@B@BNuYj1UFuuB@B@i + 2@@@@ N@@@@M 5B@B@BBkjYU252511JMB@B1 + @@B@i :@@@B@ J@B@@@MFLju515151FUJE@B@M + F@B@B @@@B@, iB@B@@B1YJ12F152F1511JPB@B@ + @B@B: EB@@@. . .::::.... O@@B@BSLuU51F151F15152u2@B@B + L@@B@ 0B@B@ .:rLuk8MB@B@B@B@B@B@@@B@B@B@B@@@@@B@B@G@@@B@PuY2251F1F151F1F1Fu2B@B@. + B@@@Y @B@BB2MB@B@@@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@BMujU52F1F151525151511Y@@@Bi + @B@B @B@@@B@@@B@@@B@@@BBZNuu7ri:,,.. B@B@0kN88MB@BEYu252525151F252F1F15UJM@B@J + JB@B@ 0@B@@BE17i,. @B@BUvJYJLJjUj125151F152525151F1F55YO@@BX + B@B@v .B@B@jUU5252221212F2515251F15252F1F2JE@B@O + @B@B. @B@BFJF1F2F2F2F2515151F152F251F5515YEB@B@ + .B@@@ B@B@ELU52F152F251525151515252F1F2F2JX@B@B + v@B@B vB@B@uj255F15151F2F15252515151F1S15JNB@B@ + PB@BX @B@BBYu2F1F1F2F15152F2515151F152F1jP@B@B + B@B@v @B@BBjJu5251S25151F15251515151F15JNB@@B + BB@@: @B@B@XYL2UF151F15151F2F251F2F251j0@B@B + B@B@i @B@B@BPJJJU251111152525152121Uuv1B@B@B. + FB@B@B vB@B@B@ZSjjLujUu1U1u2u2uuJJLj2XZ@@@B@@: + @B@B@u v@@@B@B@MOXkuujuJjJuu55qEMB@@@B@B@B@Bi + :@B@B@ :P@B@B@@@B@B@B@B@B@B@@@B@B@B@U L@B@Bi + r@B@BE .vO@@B@B@B@B@B@B@B@B@MU: Y@B@B, + r@B@Bu ,rL52F15Uv;: k@B@B + ,@@@BJ :BB1 B@B@M + . @B@BP .5X, @B@B@Bv B@B@: + r@B@@@@Mu: BB@B@ .B@B@ .8B@B@B@BF, uB@B@ + 7B@B@B@@@B@B8B@@@ 7B@B@M iMB@B@@@B@Xr. @B@B: + .:iJZ@B@B@B@@@k :5@B@B@X ,SB@B@B@B@B@BPYi.. P@B@Z + .rB@B@B@BMi r@BONE0EM@B@B@B@B@: i5@B@@@B@B@B@@@B@ :B@B@ + @B@B@B@B@O @B@B@B@@@@@B@@@5. :LEB@B@B@B@B: @B@B + iB@B@ iB@B7 :ZM@B@B@BO57, .:i B@B@ii2OOk + M@B@2 @B@B@B@B@@@ + @B@B. .jOM07 .UB@B@B@B@@@B@r + .B@B@ MB@B@@@B7 M@B@B@B@Bi + r@B@B 7O@@BJ SB@B@B@B@B. PB@BP@@B@ + uB@BO @@@B@B@Br 8@@@B@B@B@: @B@B + S@@@F @B@B@B@B@@ .B@B@B@B@B ZB@Bk + SB@B1 B@B@B@B@@@ 5@B@B@7 B@B@. + v@B@k .B@@@@@B@r 2@B@B + vB@B@:r7; vBB@BF @B@B: + :71Z@B@B@B@B@B@B@BM 8B@BE +v@B@B@B@@@B@B@@@B@B@B@r @B@B@B@@@: +@B@B@B@BMFJi: MB@BJ .B@B@B@B@@@B@Ov + .7: :@B@@ ;@@B@B@B@B@@@@2 + B@B@v Z@@@B ,LMB@B@B@r + rB@B@ B@B@B .EB@B@ + @B@BM .B@B@B .M@j + @B@B1 rB@@@M + :@B@Bj i8B@B@B@B@B@Bu GB@B@F + i@B@BX M@@@B@@@B@B@B@B@ :@@@B@i + i@B@B@ 7B@BFri:,:ivOB@X ,B@B@BM + .@B@B@L ,BB@@@Bi + qB@B@@7 jB@B@B@L + :B@B@B@2. JB@@@B@Bv + :@B@B@B@u. ,FB@B@B@BP, + .S@B@B@B@0r :jBB@B@B@@@B. + :P@B@B@B@BOv, .:7kO@B@B@B@@@B@B@@@ + .vBB@B@B@@@B@ONjr:, ,:rYXE@B@@@@@@@B@@@B@MEuri@@@B. + J@B@B@B@B@B@@@@@B@B@B@@BM8ENFPFUuUuuuU5XFP0GOMB@B@B@B@B@@@B@B@B@B@B@BMX2vr::::,iB@B@ + rB@BM71NMB@B@B@@@B@@@@@B@B@B@B@B@@@B@@@B@@@B@B@B@B@@@B@@@B@BBZqULri:::::::;;rr:r@B@B. + u@B@E.,::::iirvLJFFN0OOMM@B@BMO@B@B@@@B@B@@@@@B@MuL2JY77ii:::::::ii;irrrr7r7rr:iB@B@. + 1B@BZ,;rr;;ii:i::::::::::::,.:Z@@B@B@quLYJqB@B@B@q: ::::ii;;rrrr7rrr7r7rrii::::u@B@B. + F@@@P.::i;rrrrrrrrrr;r;r;ri,7@@@@@u. L@@B@BL,rr7r7r7r7rrrrrrii::::iLSBB@B@B@: + OB@B@EF7;::,::ii;ir;rrrrr;:7@B@BO ..... N@@@BL:rrrrri;ii:::::irLF8B@B@B@B@B@Bv + Z@B@@@B@B@MZ5J7ri:::,:::::,@B@@E .,,:,,.. N@B@B,.:::::i;7j2NO@B@B@B@B@B@E:F@B@P + @B@BBB@@@B@B@B@@@B@MOqX1u7UB@B@ .:,,,,.. ,. B@B@k1NOM@B@B@@@B@B@B@B@BSi iB@B@ + iB@B@ iYG@@@@B@@@B@B@@@B@B@B@M ,,:,,., rB@B@5. ZB@B@B@B@@@B@@@B@BBF7, @B@B + B@B@u :rjSO@@B@B@B@B@B@ .,,,.,. r@@@@@B8M@B@B@B@BOFu;:. B@B@i + S@B@B @B@@r ....... :5@B@B@B@B 5B@BB + L@@@B, 7@B@Bi . . . .B@B@Bu @B@@. + G@B@B; q@B@Bk 7@B@BM G@B@@ + B@B@B: L@B@B@O7. .rOB@B@Bu B@B@B + qB@M ZB@B@@@B@@@B@B@B@Z .B@@@B + 7MB@B@B@B@B@Mv S@8. + ,:7ri. + + + ... . .. .. + :7FB2 B@B r. :@B. L@@ @B ,.,.,.. + .@@@@B@B@B@@@B OB@ L@BO j@@ B@B@B@B@B@B@@@B@ 0PXSXSSJMB@L5FXSSuNB@u5SXSXXZi ,,,,., iB@B@@@@ B@B@B@B@@@B@M + @BOurE@B F@B M@@M: O@i :::,:,,.. :@B@O @@@@B@@@B@B@B@B@B@@@B@B@@@B@B2 @B@B@B .@E .B@ .,,.... @BL.. + rBB rB@ B@Y vEFL@BNuF2uj u@BX .B5 F5 B@ B@ BE O@. q@ + v@B :@@ E@B@B@B@B@@@ XB@P k1jujjSMG0qPqMB@BBB@B@B@v @B B@ @0 @B iLUUuY. ZB, + @B@B@B@B@B@B@@@B@B@B@B@B@B@B@B L@u .@B @@@ @B@B@BBOMOM@E2PXqkLi:vi,. @@ B@ Bq 0B, B@@@@@Y N@: + ii::,.S@B .:,:,.:@@i.::,. ,i @B. JBq 0@1 iJ r@Y @@ @B @B @1 B@ MB .B7 NB: + 7B@ @@ :@7 :@@ B@i.:::::: MBO ,::::i MB@ B@O E@B7 B@ B@ Bk @B: O@ ,@r k@, + r@M r5 @Bu 5@Bk M@v @B B@B@B@B@B@@@B@B@B@: 5B@. BE r@@F @B @B @E @B OB. :B7 PB: + ,:MB@B@B@B@. U@B .@@@. .@B PB8 E@q ;i .O; J B@ B@ B8 :@q E@ .@r k@, + B@B@@@B@BPu7, B@ uB@5 v@@S B@ E@E UEkk5277J1YvrBB@r7LYrLUFFkkqE: @B MB @Z B@ PBi YBv NB: + 0Mui. LBB MB@BB 7B@B@: OBO @B@B@B@B@O@B@B@B@B@O@B@B@@@B@; @@ @@ .@0 @B P@B@B@v N@: + v@B qB@Br iXi B@BP 8@O 7@@ iBX @Bi @B@B@B @B7v@BG @B: OB: + JB@ JB@B51@B M@@ LB@:rB@Bi GBM ,B@BL r@8 vB@8, .@@ 5@ .@Gq@Bv , Z@: + L@B PB@B@J M@B. @@7 i@B@ 0@7 B@M iO@@@r YBB r@B@BY. :. :@q MB: + G@N5S@BB Z@S. P@BZ.uB@ ,B@B7 UB@B@@@B: OB@@@5 j@B L@B@B@, iBB FMq1OB@ + 2B@B@MJ :@B@B@: Sj NFXF5i ,@u qB@ .Y. i@O Y@B@BZ. + .. :Ur + + + + k :..,, r ii v: ir .L E ..,,:,iivv :.. ,F : u .:iu1 + .u5BjL:i@@rB@ @k :Bi 7@Bu. uMiNBuL ,@SSuEB5qZUO8 :qN1uM@7777: :v@B i2X@vS@ Bv @ 7B7v7i: + .@ ,B UB v@: BX Li O O7u 2 O. 28 .Br,S :B. r7vvrE@7vjLL :B Yiv@:7@j BqiB 7B + :LuB27i8 uG .B@r..:ii,,F@: JO1@ 0;F B7@: Lr rOui k. M1::2@:ii@ ,BqF i7@,78 ON.. rB@Y7Z@ + 2 @r NY55E: r:@B77rBr :2@.v1ik .@., uM ,OG:Bq Br @5::2@,:iB, ,, @ :;vBiii @8ir vJY7 Mu + B 8E7 B 0O .@ @i :@B7 Mi 5B5: .P: i,BF j i2 5Yi:F@:ii8 .B7G 77J@rvJ: B7 @ P7 BPG + :@k@. @v7rO7 2B B B, i@ @ iJujLr@G77uJU .7r7iNBi;7rr uBL :.:B .. .@ B B BBJ + @i 1ZXqkEq0X0 7@P qk0B5 BE 7@ B B7 ZXF2U8@j11k0r YB.rSuuuGjUkX 1P @PXv@i X@: + .,. . +*/ \ No newline at end of file diff --git a/OnlineJudges/poj/1284.cpp b/OnlineJudges/poj/1284.cpp new file mode 100644 index 0000000..8ec6ebe --- /dev/null +++ b/OnlineJudges/poj/1284.cpp @@ -0,0 +1,15 @@ +#include +const int N = 1 << 16 | 1; +int phi[N]; +int main() +{ + for (int i = 2; i < N; i++) if (!phi[i]) + for (int j = i; j < N; j += i) + { + if (!phi[j]) phi[j] = j; + phi[j] = phi[j] / i * (i - 1); + } + for (int p; ~scanf("%d", &p);) + printf("%d\n", phi[p - 1]); + return 0; +} \ No newline at end of file diff --git a/省选准备/assets/banner.png b/省选准备/assets/banner.png new file mode 100644 index 0000000..18b7f4f Binary files /dev/null and b/省选准备/assets/banner.png differ diff --git a/省选准备/assets/day3/inv.cpp b/省选准备/assets/day3/inv.cpp new file mode 100644 index 0000000..c66c1c7 --- /dev/null +++ b/省选准备/assets/day3/inv.cpp @@ -0,0 +1,6 @@ +int inv(int a, int m) +{ + int x, y; + exgcd(a, m, x, y); + return (x % m + m) % m; +} diff --git a/省选准备/assets/day3/poj1061.cpp b/省选准备/assets/day3/poj1061.cpp new file mode 100644 index 0000000..999ea91 --- /dev/null +++ b/省选准备/assets/day3/poj1061.cpp @@ -0,0 +1,20 @@ +#include +typedef long long int64; +int64 gcd(int64 a, int64 b) { return b == 0 ? a : gcd(b, a % b); } +void exgcd(int64 a, int64 b, int64 &x, int64 &y) { b == 0 ? (x = 1, y = 0) : (exgcd(b, a % b, y, x), y -= x * (a / b)); } +int main() +{ + int64 s, t, p, q, L; + scanf("%lld%lld%lld%lld%lld", &s, &t, &p, &q, &L); + int64 a = (p - q + L) % L, b = L, c = (t - s + L) % L; + int64 x = 0, y = 0, g = gcd(a, b); + if (c % g) + puts("Impossible"); + else + { + a /= g, b /= g, c /= g; + exgcd(a, b, x, y); + printf("%lld", (((x % b + b) % b) * c) % b); + } + return 0; +} \ No newline at end of file diff --git a/省选准备/assets/day3/poj1284.cpp b/省选准备/assets/day3/poj1284.cpp new file mode 100644 index 0000000..8ec6ebe --- /dev/null +++ b/省选准备/assets/day3/poj1284.cpp @@ -0,0 +1,15 @@ +#include +const int N = 1 << 16 | 1; +int phi[N]; +int main() +{ + for (int i = 2; i < N; i++) if (!phi[i]) + for (int j = i; j < N; j += i) + { + if (!phi[j]) phi[j] = j; + phi[j] = phi[j] / i * (i - 1); + } + for (int p; ~scanf("%d", &p);) + printf("%d\n", phi[p - 1]); + return 0; +} \ No newline at end of file diff --git a/省选准备/assets/day3/poj2142.cpp b/省选准备/assets/day3/poj2142.cpp new file mode 100644 index 0000000..0ddc98c --- /dev/null +++ b/省选准备/assets/day3/poj2142.cpp @@ -0,0 +1,19 @@ +#include +inline int abs(int x) { return x >= 0 ? x : -x; } +void exgcd(int a, int b, int &d, int &x, int &y) { !b ? (x = 1, y = 0, d = a) : (exgcd(b, a % b, d, y, x), y -= x * (a / b)); } +int main() +{ + int a, b, c, x, y, g, u1, v1, u2, v2; + while (~scanf("%d%d%d", &a, &b, &c) && a + b + c) + { + exgcd(a, b, g, x, y); + a /= g, b /= g, c /= g; + u1 = (x % b * c % b + b) % b; + v1 = abs((c - u1 * a) / b); + v2 = (y % a * c % a + a) % a; + u2 = abs((c - v2 * b) / a); + if (u1 + v1 > u2 + v2 || (u1 + v1 == u2 + v2 && a * u1 + b * v1 > a * u2 + b * v2)) u1 = u2, v1 = v2; + printf("%d %d\n", u1, v1); + } + return 0; +} \ No newline at end of file diff --git a/省选准备/assets/day3/proot.cpp b/省选准备/assets/day3/proot.cpp new file mode 100644 index 0000000..ea5e26a --- /dev/null +++ b/省选准备/assets/day3/proot.cpp @@ -0,0 +1,35 @@ +#include +typedef unsigned long long u64; +const size_t MAXN = 1 << 16 | 1; +bool notprime[MAXN]; +int prime[MAXN], pcnt, x; +inline u64 fast_pow(u64 a, u64 b, u64 m) +{ + u64 ret = 1; + for (; b; a = a * a % m, b >>= 1) + if (b & 1) + ret = ret * a % m; + return ret; +} +int main() +{ + for (size_t i = 2; i < MAXN; i++) + if (!notprime[i] && (prime[pcnt++] = int(i))) + for (size_t j = i * i; j < MAXN; j += i) + notprime[j] = true; + while (~scanf("%d", &x)) + for (int a = 2, flag = 0; flag == 0; a++) + { + flag = 1; + for (int i = 0, k = x - 1; i < pcnt && k > 1 && flag; i++) + if (k % prime[i] == 0) + { + flag = fast_pow(a, (x - 1) / prime[i], x) != 1; + while (k % prime[i] == 0) + k /= prime[i]; + } + if (flag) + printf("%d\n", a); + } + return 0; +} \ No newline at end of file diff --git a/省选准备/省选基础算法.pdf b/省选准备/省选基础算法.pdf index 4e12a83..96b1294 100644 Binary files a/省选准备/省选基础算法.pdf and b/省选准备/省选基础算法.pdf differ diff --git a/省选准备/省选基础算法.tex b/省选准备/省选基础算法.tex index 062f8df..f7defb3 100644 --- a/省选准备/省选基础算法.tex +++ b/省选准备/省选基础算法.tex @@ -4,6 +4,7 @@ \begin{document} \setcounter{page}{0} \maketitle +\begin{center}\includegraphics[height=20cm]{assets/banner.png}\end{center} \newpage \tableofcontents \newpage @@ -298,4 +299,34 @@ Manacher 模板题 \subparagraph{算法说明} $$M_i=\prod\limits_{j\ne i}m_j\to gcd(M_i,m_i)=1\Rightarrow \exists p_i,q_i,\,M_ip_i+m_iq_i=1$$ $$(e_i=M_i p_i)\equiv int(j==i)\pmod{m_i} \to \sum\limits_1^r e_i a_i\mod{\sum\limits_1^r m_i}\mbox{是方程的最小非负整数解}$$ +\paragraph{练习题} +\subparagraph{\href{http://poj.org/problem?id=1061}{POJ1061} - 蛤蛤的约会} +1s +\codeinput[蛤蛤的约会]{assets/day3/poj1061.cpp} +\subparagraph{\href{http://poj.org/problem?id=2142}{POJ2142} - The Balance} 求$ax+by=c$的一组解,使得$|x|+|y|$尽量小,在前者尽量小时$|ax|+|by|$尽量小 +\codeinput[The Balance]{assets/day3/poj2142.cpp} +\subsection{逆元} +\paragraph{解一元线性同余方程} + $$gcd(a,m)=1\Rightarrow\exists x,ax\equiv1\pmod{m}$$ + $$ax\equiv1\pmod{m}\iff\exists k\in\mathbb{Z},\,ax-km=1$$ +\codeinput[\ ]{assets/day3/inv.cpp} +\paragraph{费马小定理} + $$\forall p\in\mathbb{P}\to x^p\equiv x\pmod{p}$$被称为费马小定理,若$p\nmid x$,有 + $$x^{p-1}\equiv 1\pmod{p}$$于是有 + $$\forall p\in\mathbb{P},x\in\mathbb{Z}\to x^{-1}\equiv x^{p-2}\pmod{p}$$ + 使用快速幂即可计算。 +\subsection{待续:高次不定方程} +\subsection{原根} +\paragraph{阶} + $$n>1,a\in\mathbb{Z},gcd(a,n)=1\to\exists r\in[1,n],a^r\equiv1\pmod{n}$$ $r$的最小整数值称为$a$模$n$的阶,记为$Ord_n(a)$ +\paragraph{阶的性质} + $$gcd(a,n)=1,r=Ord_n(a),\forall N\in\{x|a^N\equiv1\pmod{n}\}\Rightarrow r|N$$ + $$gcd(a,n)=1\Rightarrow Ord_n(a)|\varphi(n)$$ + $$\mbox{特别的,}p\in\mathbb{P},gcd(a,p)=1\Rightarrow Ord_p(a)|p-1\mbox{,显然}\varphi(p)=p-1$$ +\paragraph{原根} $n\in\mathbb{N_+},a\in\mathbb{Z},Ord_n(a)=\varphi(n)$,则称$a$为模$n$的一个原根,由阶的定义可知原根和$n$必然互质。 +\paragraph{求质数$p$的原根算法} + 暴力从小到大枚举$g\in\mathbb{N_+}$,$\forall a\in\{x\;|\;x|p-1,x\in\mathbb{P}\},g^{\frac{p-1}{a}}\not\equiv1\pmod{p}$ +\codeinput[Primitive Root]{assets/day3/proot.cpp} +\paragraph{练习题} +\subparagraph{\href{http://poj.org/problem?id=1284}{POJ1284} - Primitive Roots} 如果$n\in\mathbb{N_+}$有一个原根,那么$n$一共有$\varphi(\varphi(n))$个不同余的原根 +\codeinput[Primitive Roots]{assets/day3/poj1284.cpp} \end{document} \ No newline at end of file