-
μ ν΄λ¦¬λ μκ³ λ¦¬μ¦ - λ μμ μ΅λ곡μ½μλ?π€¨ALicademy π©βπ«π¨βπ«/μκ³ λ¦¬μ¦ 2021. 7. 4. 23:55
πIntro
μΉλ§₯μ κ³ μ₯μΈ λ§₯μΉλ§μμμλ 맀λ μΉλ§₯μΆμ ππΊλ₯Ό μ½λλ€. μ¬ν΄λ μΆμ λ₯Ό μν΄ μΉν¨ 4,500λ§λ¦¬πμ λ§₯μ£Ό 7,500μπΊμ μ€λΉνμ΅λλ€. μ΄κ²λ€μ μ΅λν λ§μ μ¬λλ€μκ² λ¨κΉμμ΄ λκ°μ΄ λλμ΄ μ£Όλ €κ³ ν λ, 1οΈβ£ μ΅λ λͺ λͺ μκ² λλμ΄ μ€ μ μμΌλ©° 2οΈβ£ ν μ¬λ λΉ μΉν¨ λͺ λ§λ¦¬μ λ§₯μ£Ό λͺ μμ λ°μ μ μμκΉμ?
λ¬Έμ λ₯Ό λͺ¨λ λ§μΆμ ¨λμ? μ¬λ¬λΆμ΄ μ΄λ―Έ μκ³ κ³μλ―μ΄ 1οΈβ£λ² λ¬Έμ μ λ΅μ 4,500κ³Ό 7,500μ 'μ΅λ 곡μ½μ(Greatest Common Divisor)'μΈ 150λͺ μ λλ€. λν 2οΈβ£λ² λ¬Έμ μ λ΅μ μΉν¨ 4,500λ§λ¦¬μ λ§₯μ£Ό 7,500μμ μ΅λ 곡μ½μμΈ 150μΌλ‘ λλ 3λ§λ¦¬μ 5μμ λλ€. (ν μ¬λλΉ μΉν¨ μΈ λ§λ¦¬πππμ λ§₯μ£Ό 5μπΊπΊπΊπΊπΊμ΄λΌλ... μ λ§ μ’μ μΆμ λ€μπ)
κ·Έλ λ€λ©΄ λ§μ½ nλ ν μΉλ§₯μΆμ ππΊκ° μ μΈκ³μ μΌλ‘ λλ°μ΄ λλ©΄μ μΉν¨ 9,876,543λ§λ¦¬πμ λ§₯μ£Ό 3,456,789μπΊλ₯Ό μ€λΉνλ€κ³ ν λ, 1οΈβ£λ² λ¬Έμ μ 2οΈβ£λ² λ¬Έμ μ λ΅μ κ°κ° 무μμΌκΉμ?
μλ§ λ°λ‘ λ΅μ ꡬνκΈ΄ μ΄λ €μ°μ€ κ² κ°μλ°μ. μ»΄ν¨ν°κ° λμ ꡬν΄λ³΄κ² νλ κ² μ΄λ¨κΉμ?
πμ΅λ 곡μ½μ ꡬνκΈ°
λ μ μ a, b (a>b)μ μ΅λ 곡μ½μλ₯Ό gcd(a,b)λΌκ³ ν©μλ€. gcd(a,b)λ₯Ό μ»΄ν¨ν°λ‘ μ΄λ»κ² ꡬν μ μμκΉμ?
1. Brute-force π₯
κ°μ₯ λ¨Όμ 무μνκ² κ΅¬νλ λ°©λ²μ΄ μμ΅λλ€. gcd(a,b)λ 1λΆν° b μ€ a, b λͺ¨λμ λλμ΄ λ¨μ΄μ§λ κ°μ₯ ν° μμ λλ€. λ°λΌμ 1λΆν° bκΉμ§ μ°¨λ‘λ‘ μ¦κ°νλ©° a, b λͺ¨λμ λλμ΄ λ¨μ΄μ§λμ§ νμΈνλ©΄ λ©λλ€.
μ΄ μκ³ λ¦¬μ¦μ ꡬνν μ½λλ μλμ κ°κ³ β°μκ° λ³΅μ‘λλ O(b)μ λλ€.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersint gcd_brute(int a, int b) { int _gcd = 0; for(int i = 1; i <= b; i++) if(a % i == 0 && b % i == 0) _gcd = i; return _gcd; } 2. 곡μ½μμ μ±μ§ μ΄μ©νκΈ°
μ΄λ²μλ μ°μνκ² μνπ«μ μ΄μ©ν΄λ³ΌκΉμ?
곡μ½μμ μ±μ§ μ€ νλλ 'λ μ μ a, b (a>b)μ 곡μ½μμ μ§ν©μ aβbμ bμ 곡μ½μ μ§ν©κ³Ό κ°λ€'λ κ²μ λλ€. μ΄ μ±μ§μ μλμ κ°μ΄ κ°λ¨νκ² μ¦λͺ ν μ μμ΅λλ€.
pf.a, bμ곡μ½μ gκ° μλ€κ³ νμ.κ·Έλ λ€λ©΄ a=aβ²g, b=bβ²gλΌκ³ ν μ μλ€. μ΄λ, aβb=(aβ²βbβ²)g μ΄λ―λ‘a, bμ 곡μ½μμ μ§ν©μ aβbμ bμ 곡μ½μμ μ§ν©κ³Ό κ°λ€.
μ΄ μ±μ§μ μ΄μ©νλ©΄ μλμ κ°μ μ½λλ₯Ό ꡬνν μ μμ΅λλ€.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersint gcd_math(int a, int b) { if(a < b) swap(a, b); return (b) ? gcd_math(a - b, b) : a; } μ΄λ β°μκ° λ³΅μ‘λλ n=a+bλΌκ³ ν λ, O(n)μ λλ€. μλνλ©΄ gcd(a,b)λ μ΅λ a+bλ² λ°λ³΅νκΈ° λλ¬ΈμΈλ° λ€μκ³Ό κ°μ΄ μ¦λͺ ν μ μμ΅λλ€. κ°λ¨νκ²λ μ΅μ μ κ²½μ° μ¦, gcd(a,1)μΌ λ ν¨μκ° λͺ λ² μ€νλλμ§ μΈλ λ°©λ²λ μμ΅λλ€.
pf.λ μ μ a, b(a>b)μ λνμ¬gcd(a,b)=gcd(aβb,b)=gcd(aβ²,bβ²)λΌκ³ νμ. μ΄λ λ€μμ κ°μ κ΄κ³κ° μ±λ¦½νλ€.{aβ²=aβbbβ²=b κ·Έλ¦¬κ³ aβ²+bβ²=a<a+b μ΄λ€.λ°λΌμ gcd(a,b)λ μ΅λ a+bλ² λ°λ³΅νλ€.
μ°μνκ² μνμ μ΄μ©νλλ° κ²°κ³Όλ κ·Έλ κ² λ§μ‘±μ€λ½μ§λ μλ€μ...π
κ·Έλ λ€λ©΄ 곡μ½μμ λ€λ₯Έ μ±μ§μ μ΄μ©ν΄λ³΄λ©΄ μ΄λ¨κΉμ?
π’μ ν΄λ¦¬λ μκ³ λ¦¬μ¦
μ ν΄λ¦¬λ μκ³ λ¦¬μ¦μ μμ¬μ κ°μ₯ μ€λλ μκ³ λ¦¬μ¦μΌλ‘ μ λͺ νκ³ μλμ κ°μ μ±μ§μ μ΄μ©νμ¬ λ μμ μ΅λ 곡μ½μλ₯Ό ꡬν©λλ€.
λ μ μ a, b (a>b)μ λνμ¬ gcd(a, b)=gcd(b, amodb)μ΄λ€.
μ΄ μ±μ§μ λ€μκ³Ό κ°μ΄ κ°λ¨νκ² μ¦λͺ ν μ μμ΅λλ€.
pf.r=amodb, a=bΓt+r (tβZ)λΌκ³ νμ. Case 1. d=gcd(a,b)μΌλ, dβ£(bΓt+r)μ΄κ³ dβ£bμ΄λ€.λ°λΌμ, dβ£rμ΄λ€. κ·Έλ¬λ―λ‘, gcd(a,b)=gcd(b,r)μ΄λ€. Case 2. c=gcd(b,r)μΌλ, cβ£bμ΄κ³ cβ£rμ΄λ€.λ°λΌμ, cβ£aμ΄λ€. κ·Έλ¬λ―λ‘, gcd(b,r)=gcd(a,b)μ΄λ€. λ°λΌμ,gcd(a,b)=gcd(b,r)μ΄λ€.
μ΄ μ±μ§μ μ΄μ©νλ©΄ μλμ κ°μ μ½λλ‘ κ΅¬νν μ μμ΅λλ€.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersint gcd(int a, int b) { return (b) ? gcd(b, a % b) : a; } ν ... κ·Όλ° κ³Όμ° μ΄ λ°©λ²μ΄ λ€λ₯Έ λ°©λ²λ€ λ³΄λ€ λΉ λ₯ΌκΉμ? π€
β°λ³΅μ‘λ λΆμ
μκ³ λ¦¬μ¦μ 볡μ‘λλ₯Ό λΆμνλ μ¬λ¬ λ°©λ²λ€μ΄ μμ΅λλ€. κ·Έ μ€ κ°λ¨νκ² λ§€ μ€νλ§λ€ μ€μ΄λ μλ£μ ν¬κΈ°λ‘ ν΅ν΄ 볡μ‘λλ₯Ό λΆμνλ λ°©λ²μ΄ μμ΅λλ€. κ·ΈλΌ ν λ² λΆμν΄λ³ΌκΉμ?
μ ν΄λ¦¬λ μκ³ λ¦¬μ¦μ λ μ μ a, b (a>b)μ λνμ¬ bκ° 0μ΄ λ λκΉμ§ λ°λ³΅μ μΌλ‘ ν¨μλ₯Ό νΈμΆν©λλ€.
κ·ΈλΌ μλμ κ°μ΄ κ²½μ°λ₯Ό λλ μ μκ°ν΄λ³΄λ 건 μ΄λ¨κΉμ?π‘
gcd(a,b)=gcd(aβ²,bβ²)=gcd(b,amodb)λΌκ³ ν λ Case 1 : b (=aβ²)>a2 amodb(=bβ²)=aβb<a2 Case 2 : b(=aβ²)β€a2 amodb(=bβ²)<bβ€a2
κ²½μ°λ₯Ό λλ 보λ amodb<a2μΈ κ²μ΄ λΆλͺ ν΄μ‘μ΅λλ€. κ·Έλ¬λ―λ‘ λ§€ μ€νλ§λ€ μλ£μ ν¬κΈ°κ° μ λ° μ΄μ μ€μ΄λ λ€λ μ¬μ€μ μ μ μμ΅λλ€. λ°λΌμ, β°μκ° λ³΅μ‘λλ O(log(min(a,b))μ λλ€.
Let's do PSπ
κ·ΈλΌ μ€λ 곡λΆν λ΄μ©λ€λ‘ λ¬Έμ λ₯Ό ν΄κ²°ν΄λ³ΌκΉμ?
μ€λ ν΄κ²°ν λ¬Έμ λ BOJ 2609 - μ΅λ곡μ½μμ μ΅μ곡배μμ λλ€.
λ¨Όμ μ€μ€λ‘ ν΄κ²°ν΄λ³΄μκ³ λμμ΄ νμνμλ©΄ μλ μ½λλ₯Ό μ°Έκ³ νμΈμ.
λ보기This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <cstdio> int gcd(int a, int b) { return (b) ? gcd(b, a % b) : a; } int main() { int n1, n2, _gcd; scanf("%d %d", &n1, &n2); _gcd = gcd(n1, n2); printf("%d\n%d", _gcd, (n1 * n2) / _gcd); return 0; } Further Thinkingπ§
gcd(a,b)=d λΌκ³ ν λ d=ax+dy (x,yβZ)λ‘ μ μν μ μμ΅λλ€.
μλνλ©΄ dλ a,bμ μ΅λ 곡μ½μμ΄κΈ° λλ¬Έμ λλ€. κ·Έλ λ€λ©΄ μ΄λ xμ yμ κ°μ μ΄λ»κ² μ μ μμκΉμ?
κ·Έλ¦¬κ³ μ΄κ±Έ λλ체 μ΄λμ μμ©ν μ μμκΉμ?
κ·Έκ²λ€μ λ€μ κ°μμμ μμλ³΄κ² μ΅λλ€. π¨βπ«π¨βπ«π¨βπ«
πμ°Έκ³
https://ko.wikipedia.org/wiki/μ ν΄λ¦¬λ_νΈμ λ²
https://codility.com/media/train/10-Gcd.pdf
'ALicademy π©βπ«π¨βπ« > μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π² Segment Tree 2 - λ λΉ λ₯Έ updateλ₯Ό μν Lazy Propagation! (0) 2020.09.01 π² Segment Tree 1 - Segment Treeλ? (0) 2020.08.31