Pagini recente » Cod sursa (job #2578647) | Cod sursa (job #2465997) | Cod sursa (job #641357) | Cod sursa (job #1538542) | Cod sursa (job #1019847)
#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],standard_u[21][21];
void intialize_units ()
{
standard_u[0][0] = 1;
standard_u[k-1][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==1)
{
memcpy (m,standard_u,sizeof(standard_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 = 0;
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));
if (dist!=0)
{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;
}
}
memcpy (a,temp,sizeof(a));
}
for (int i=k-1; i>=1; --i)
{
a[i] = a[i-1];
}
a[0]=0;
current = gap[i];
}
fout<<a[1];
}