ํ๋ ฌ ์ ๊ณฑ ์ฑ๊ณต
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';
}
}