Pagini recente » Monitorul de evaluare | Cod sursa (job #660628) | Cod sursa (job #2819602) | Cod sursa (job #3358827)
#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};
init.mat[0][k-1]=1;
mulmat={k, k};
for(int i=0;i<k-1;i++)
mulmat.mat[i+1][i]=1;
mulmat.mat[0][k-1]=mulmat.mat[k-1][k-1]=1;
}
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;
}