Pagini recente » Cod sursa (job #3309863) | Cod sursa (job #1047335) | Cod sursa (job #2922592) | Cod sursa (job #2254052) | Cod sursa (job #3358826)
#include <fstream>
#include <cassert>
using namespace std;
ifstream in("pod.in");
ofstream out("pod.out");
const int KMAX=20, MOD=9901;
int n, m, k;
struct matrix
{
int di, dj, mat[KMAX][KMAX];
friend matrix operator*(const matrix &a, const matrix &b)
{
matrix c={a.di, b.dj};
for(int i=0;i<c.di;i++)
for(int j=0;j<c.dj;j++)
{
c.mat[i][j]=0;
for(int k=0;k<a.dj;k++)
c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j]%MOD)%MOD;
}
return c;
}
}init, mulmat;
matrix lgpow(matrix a, int b)
{
if(b==1)
return a;
matrix p=lgpow(a, b/2);
if(b%2)
return p*p*a;
return p*p;
}
void init_mat()
{
init={1, k};
for(int i=0;i<k-1;i++)
init.mat[0][i]=0;
init.mat[0][k-1]=1;
mulmat={k, k};
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
if(j<k-1 && i==j+1)
mulmat.mat[i][j]=1;
else if(j==k-1 && (i==0 || i==k-1))
mulmat.mat[i][j]=1;
else
mulmat.mat[i][j]=0;
}
signed main()
{
in>>n>>m>>k;
assert(m==0);
init_mat();
matrix ans=init*lgpow(mulmat, n);
out<<ans.mat[0][k-1];
return 0;
}