Skip to content

Conversation

@froglike6
Copy link
Collaborator

@froglike6 froglike6 commented Jul 22, 2025

πŸ”— 문제 링크

Gold 2 Fibonacci

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

10λΆ„

✨ μˆ˜λ„ μ½”λ“œ

μˆ˜λ„μ½”λ“œ

μž…λ ₯: μ—¬λŸ¬ μ€„μ˜ μ •μˆ˜ n₁, nβ‚‚, …, nβ‚˜ (λ§ˆμ§€λ§‰ 쀄은 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 제거)

μƒμˆ˜ MOD ← 10000

ν•¨μˆ˜ fibo(n):
    m00, m01, m10, m11 ← 1, 1, 1, 0        // ν–‰λ ¬ M = [[1,1],[1,0]]
    v0, v1 ← 1, 0                           // 벑터 V = [F₁, Fβ‚€]

    while n > 0:
        λ§Œμ•½ (n의 μ΅œν•˜μœ„ λΉ„νŠΈκ°€ 1) 이라면:
            t0 ← (m00*v0 + m01*v1) mod MOD
            t1 ← (m10*v0 + m11*v1) mod MOD
            v0 ← t0
            v1 ← t1

        // M ← M Γ— M  (ν–‰λ ¬ 제곱)
        a ← (m00*m00 + m01*m10) mod MOD
        b ← (m00*m01 + m01*m11) mod MOD
        c ← (m10*m00 + m11*m10) mod MOD
        d ← (m10*m01 + m11*m11) mod MOD
        m00, m01, m10, m11 ← a, b, c, d

        n ← n >> 1   // n을 였λ₯Έμͺ½μœΌλ‘œ 1λΉ„νŠΈ μ‹œν”„νŠΈ (2둜 λ‚˜λˆ”)

    λ°˜ν™˜ v1

메인 절차:
    inputs ← 빈 리슀트
    ν‘œμ€€ μž…λ ₯μ—μ„œ ν•œ 쀄씩 읽어듀인닀:
        line ← trim(line)
        λ§Œμ•½ line이 λΉ„μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄:
            inputs에 Long(line)을 μΆ”κ°€
    λ§Œμ•½ inputsκ°€ λΉ„μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄:
        inputs의 λ§ˆμ§€λ§‰ μ›μ†Œλ₯Ό 제거

    각 n ∈ inputs에 λŒ€ν•΄:
        좜λ ₯ fibo(n)

    좜λ ₯ 버퍼 λΉ„μš°κΈ° 및 μ’…λ£Œ

#9 μ—μ„œλ„ μ†Œκ°œν•œ 행렬을 μ΄μš©ν•œ ν”Όλ³΄λ‚˜μΉ˜μž…λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” λ‹¨μˆœνžˆ $f(n)\mod10000$을 좜λ ₯ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
image
μœ„μ˜ 이미지와 같이, 행렬을 μ΄μš©ν•΄μ„œ ν”Όλ³΄λ‚˜μΉ˜ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ–΄λ–€ ν–‰λ ¬μ˜ 제곱 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ, λΆ„ν•  정볡을 μ΄μš©ν•œ κ±°λ“­ μ œκ³±μ„ ν™œμš©ν•˜μ—¬ μ œκ³±μ„ λΉ λ₯΄κ²Œ ν•˜κ²Œ λ©λ‹ˆλ‹€.
#9 와 λ‹€λ₯΄κ²Œ, λ‚˜λ¨Έμ§€ μ—°μ‚°μ˜ μˆ˜κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— κ·Έ 수만 λ°”κΏ”μ£Όλ©΄ 이 문제λ₯Ό ν’€ 수 있게 λ©λ‹ˆλ‹€.

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

Copy link
Contributor

@dohyeondol1 dohyeondol1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μˆ˜ν•™μ˜ μ„Έκ³„λŠ” 정말 μ‹ κΈ°ν•œκ²Œ λ§Žκ΅°μš”...
μ €λ²ˆ PR땐 λ§‰μ—°νžˆ μ–΄λ ΅λ‹€κ³ λ§Œ λŠκΌˆλŠ”λ°, μ΄λ²ˆμ—λŠ” μ‘°κΈˆμ΄λ‚˜λ§ˆ 이해할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€..
κ·Έλ ‡λ‹€κ³  문제λ₯Ό ν’€ 수 μžˆμ—ˆλ˜ 건 μ•„λ‹ˆμ—ˆμ§€λ§Œ.. γ… γ… 
풀이λ₯Ό 보고 μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ΄€μŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

const int MOD = 10000;

int fibo(long long n) {
    long long m00 = 1, m01 = 1, m10 = 1, m11 = 0;
    long long v0 = 1, v1 = 0;

    while(n > 0) {
        if((n & 1) == 1) {
            long long t0 = (m00 * v0 + m01 * v1) % MOD;
            long long t1 = (m10 * v0 + m11 * v1) % MOD;
            v0 = t0;
            v1 = t1;
        }
        long long a = (m00 * m00 + m01 * m10) % MOD;
        long long b = (m00 * m01 + m01 * m11) % MOD;
        long long c = (m10 * m00 + m11 * m10) % MOD;
        long long d = (m10 * m01 + m11 * m11) % MOD;
        m00 = a; m01 = b;
        m10 = c; m11 = d;

        n >>= 1;
    }
    return (int)v1;
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    
    vector<long long> inputs;
    string line;

    while(getline(cin, line)) {
        if(!line.empty()) {
            stringstream ss(line);
            long long num;
            if(ss >> num) {
                inputs.push_back(num);
            }
        }
    }
    
    if(!inputs.empty()) inputs.pop_back();

    for(long long n : inputs)
        cout << fibo(n) << '\n';

    return 0;
}

행렬을 μ΄μš©ν•œ ν”Όλ³΄λ‚˜μΉ˜μ— λŒ€ν•΄μ„œ ν™•μ‹€ν•˜κ²Œ 배우고 κ°‘λ‹ˆλ‹€..
μ΄λ²ˆμ—” java둜 ν‘Έμ‹  점이 μΈμƒκΉŠλ„€μš”...

@Fnhid
Copy link
Collaborator

Fnhid commented Aug 7, 2025

쑰금 더 μ°Ύμ•„λ³΄λ‹ˆ, 피사노 μ£ΌκΈ°λΌλŠ” 것이 μžˆλ„€μš”.
ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄ mod 10000λŠ” 15000νšŒμ”© λ°˜λ³΅λ˜λŠ”λ°, μ΄λŸ¬ν•œ μ£ΌκΈ°λ₯Ό 피사노 주기라고 ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

μ €λŠ” 쑰금 λ¬΄μ‹ν•œ 방법을 μ‚¬μš©ν•΄μ„œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€.

def get_pisano_period_array(m):
    pisano = [0, 1]
    prev, curr = 0, 1
    while True:
        prev, curr = curr, (prev + curr) % m
        pisano.append(curr)
        if prev == 0 and curr == 1:
            pisano = pisano[:-2]
            break
    return pisano

mod = 10000
pisano_period_array = get_pisano_period_array(mod)

with open("./pisano_mod.txt", "w") as f:
    f.write(", ".join(map(str, pisano_period_array)))

μ΄λ ‡κ²Œ 피사노주기λ₯Ό λ”°λ‘œ κ΅¬ν•΄μ„œ

#include <iostream>

using namespace std;


int pisano[15000] = {};// μš©λŸ‰λ•Œλ¬Έμ— μƒλž΅
int main()
{
    long long i=0;


    while (1)
    {
        cin >> i;

        if (i==-1) break;
        cout << pisano[i%15000] << "\n";
    }

    return 0;
}

pisano에 ν•˜λ“œμ½”λ”©ν•΄μ€¬μŠ΅λ‹ˆλ‹€!

@froglike6 froglike6 merged commit 326c83c into 22-froglike6 Aug 8, 2025
1 check passed
@froglike6 froglike6 deleted the 23-froglike6 branch August 8, 2025 05:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants