Pagini recente » Cod sursa (job #7234) | Cod sursa (job #1433592) | Cod sursa (job #99370) | Cod sursa (job #2869510) | Cod sursa (job #1019829)
#include <fstream>
#include <cstring>
#include <algorithm>
#define mod 9901
using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
int gap[1001],k,n,m,current;
int a[21],gap_u[21][21],u[21][21],standard_u[21][21];
void intialize_units ()
{
for (int i=0; i<k; ++i)
{
u[i][i] = 1;
}
for (int i=1; i<k; ++i)
{
gap_u[i-1][i] = 1;
}
for (int i=0; i<k; ++i)
standard_u[i][0] = 1;
for (int i=1; i<k; ++i)
{
standard_u[i-1][i] = 1;
}
}
void matrix_power (int m[][21], int p)
{
if (p==0)
{
memcpy (m,u,sizeof(u));
return;
}
int send[21][21],temp[21][21];
memset (temp,0,sizeof(temp));
memset (send,0,sizeof(send));
matrix_power (send, p/2);
for (int i=0; i<k; ++i)
for (int j=0; j<k; ++j)
for (int h=0; h<k; ++h)
{
temp[i][j] += (send[i][h]*send[h][j])%mod;
if (temp[i][j] >= mod) temp[i][j] -= mod;
}
if (p%2)
{
for (int i=0; i<k; ++i)
for (int j=0; j<k; ++j)
for (int h=0; h<k; ++h)
{
m[i][j] += (temp[i][h]*standard_u[h][j])%mod;
if (m[i][j] >= mod) m[i][j] -= mod;
}
}
else
{
memcpy (m,temp,sizeof(temp));
}
}
int main()
{
fin>>n>>m>>k;
for (int i=1; i<=m; ++i)
fin>>gap[i];
sort (gap+1, gap+m+1);
intialize_units ();
a[0] = 1;
current = 1;
gap[m+1] = n+1;
for (int i=1; i<=m+1; ++i)
{
int dist = gap[i] - current - 1;
int ma[21][21],temp[21];
memset (ma,0,sizeof(ma));
memset (temp,0,sizeof(temp));
matrix_power (ma,dist);
for (int i=0; i<k; ++i)
{
for (int j=0; j<k; ++j)
{
temp[i] += (a[j]*ma[j][i])%mod;
if (temp[i] >= mod) temp[i] -= mod;
}
}
memset (a,0,sizeof(a));
for (int i=0; i<k ; ++i)
{
for (int j=0; j<k; ++j)
{
a[i] += (temp[j]*gap_u[j][i])%mod;
if (a[i] >= mod) a[i] -= mod;
}
}
current = gap[i];
}
fout<<a[1];
}