Pagini recente » Cod sursa (job #2325625) | Cod sursa (job #2509113) | Cod sursa (job #799124) | Cod sursa (job #2336537) | Cod sursa (job #2241515)
#include<fstream>
#include<vector>
#include<algorithm>
#define MOD 9901
using namespace std;
ifstream fi("pod.in");
ofstream fo("pod.out");
int n,m,k,i,j,nr,P[1005],A[25],Aux[25][25],Mat[25][25],Rez[25][25];
vector<int> Dp;
void inm(int A[][25], int B[][25])
{
int i,j,ind;
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
Aux[i][j]=0;
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
for(ind=1; ind<=k; ind++)
Aux[i][j]=(Aux[i][j]+A[i][ind]*B[ind][j])%MOD;
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
A[i][j]=Aux[i][j];
}
void inm(int A[][25], int B[])
{
int i,j;
for(i=1; i<=k; i++)
Aux[i][1]=0;
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
Aux[i][1]=(Aux[i][1]+A[i][j]*B[j])%MOD;
for(i=1; i<=k; i++)
B[i]=Aux[i][1];
}
void put(int b)
{
int i;
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
Mat[i][j]=Rez[i][j]=0;
for(i=1; i<k; i++)
{
Mat[i][i+1]=1;
Rez[i][i]=1;
}
Mat[k][1]=Mat[k][k]=1;
Rez[k][k]=1;
for(i=0; (1<<i)<=b; i++)
{
if((1<<i)&b)
inm(Rez,Mat);
inm(Mat,Mat);
}
inm(Rez,A);
}
int main()
{
fi>>n>>m>>k;
for(i=1; i<=m; i++)
fi>>P[i];
sort(P+1,P+m+1);
if(P[m]==n)
{
fo<<"0\n";
fi.close();
fo.close();
return 0;
}
for(i=1; i<k; i++)
Dp.push_back(0);
Dp.push_back(1);
P[++m]=n+1;
for(i=0; i<m; i++)
{
nr=P[i+1]-P[i]-1;
if(i!=0)
{
Dp.push_back(0);
Dp.erase(Dp.begin(),Dp.begin()+1);
}
if(nr>0)
{
Dp.push_back(((*Dp.rbegin())+(*Dp.begin()))%MOD);
Dp.erase(Dp.begin(),Dp.begin()+1);
if(nr>1)
{
for(j=1; j<=k; j++)
A[j]=Dp[j-1];
put(nr-1);
for(j=1; j<=k; j++)
Dp[j-1]=A[j];
}
}
}
fo<<(*Dp.rbegin())<<"\n";
fi.close();
fo.close();
return 0;
}