algorithm

BOJ 10830

rkawk 2022. 10. 1. 14:16
๋”๋ณด๊ธฐ

ํ–‰๋ ฌ ์ œ๊ณฑ ์„ฑ๊ณต

 

 

1 ์ดˆ 256 MB 23784 8324 6628 34.033%

๋ฌธ์ œ

ํฌ๊ธฐ๊ฐ€ N*N์ธ ํ–‰๋ ฌ A๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, A์˜ B์ œ๊ณฑ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ˆ˜๊ฐ€ ๋งค์šฐ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, A^B์˜ ๊ฐ ์›์†Œ๋ฅผ 1,000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ–‰๋ ฌ์˜ ํฌ๊ธฐ N๊ณผ B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤  5, 1 ≤ B ≤ 100,000,000,000)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ํ–‰๋ ฌ์˜ ๊ฐ ์›์†Œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ–‰๋ ฌ์˜ ๊ฐ ์›์†Œ๋Š” 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ–‰๋ ฌ A๋ฅผ B์ œ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

2 5
1 2
3 4

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

69 558
337 406

์˜ˆ์ œ ์ž…๋ ฅ 2 ๋ณต์‚ฌ

3 3
1 2 3
4 5 6
7 8 9

์˜ˆ์ œ ์ถœ๋ ฅ 2 ๋ณต์‚ฌ

468 576 684
62 305 548
656 34 412

์˜ˆ์ œ ์ž…๋ ฅ 3 ๋ณต์‚ฌ

5 10
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1

์˜ˆ์ œ ์ถœ๋ ฅ 3 ๋ณต์‚ฌ

512 0 0 0 512
512 0 0 0 512
512 0 0 0 512
512 0 0 0 512
512 0 0 0 512โ€‹

๊ฑฐ๋“ญ์ œ๊ณฑ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ œ๋ผ ๋”ฐ๋กœ ์–ด๋ ค์šด๊ฑด ์—†์—ˆ๊ณ , ํ–‰๋ ฌ ๊ณฑ์…ˆ๋งŒ ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ

์™œ์ธ์ง€ ๊ณ„์† ์•ˆ๋˜์„œ ์ฝ”๋“œ๋ฅผ ์„ธ๋ฒˆ์ด๋‚˜ ๋‹ค์‹œ์งฐ๋‹ค.

ํ™”๋‚œ๋‹ค

 

์ฝ”๋“œ๋Š” power mod 2๊ฐ€ 1์ผ๋•Œ๋Š” power -1๋กœ ์žฌ๊ท€๋ฅผ ๋Œ๋ ค

A^P(power)/2 * A^P/2 * A๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๊ณ 

0์ผ๋•Œ๋Š” ๋ฐ”๋กœ power/2๋ฅผ ๋„ฃ์–ด

A^P/2 * A/P/2๋กœ ๋ถ„ํ• ํ•ด์ฃผ์—ˆ๋‹ค.

 

logB์˜ ์—ฐ์‚ฐ์ด๋ฏ€๋กœ ์‹œ๊ฐ„์€ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ๋‹ค๋งŒ B๊ฐ€ 100000000000๊นŒ์ง€ ์ด๋ฏ€๋กœ longlong์„ ์จ์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•˜์ž.

 

 

#include <iostream>
using namespace std;
long long N, B;
long long A[6][6], NA[6][6];
void func(long long power){
    if(power == 1)
        return;
    else if(power%2 == 0){
        func(power/2);
        long long check[6][6];
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++){
                check[i][j] = 0;
                for(int k=0; k<N; k++)
                    check[i][j] += (A[i][k]*A[k][j])%1000;
            }
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                A[i][j] = check[i][j]%1000;
    }else{
        func(power-1);
        long long check[6][6];
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++){
                check[i][j] = 0;
                for(int k=0; k<N; k++)
                    check[i][j] += (A[i][k]*NA[k][j])%1000;
            }
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                A[i][j] = check[i][j]%1000;        
    }
    
}
int main(){
    cin>>N>>B;
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++){
            cin>>A[i][j];
            NA[i][j] = A[i][j];
        }
    
    func(B);

    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++)
            cout<<A[i][j]%1000<<' ';
        cout<<'\n';
    }
}

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ 1629  (0) 2022.10.01
BOJ 9935  (0) 2022.10.01
BOJ 13172  (0) 2022.09.29
BOJ 1932  (0) 2022.09.28
BOJ 11779  (0) 2022.09.28