Pagini recente » Cod sursa (job #3238468) | Cod sursa (job #1408769) | Cod sursa (job #3241887) | Cod sursa (job #2274082) | Cod sursa (job #2241535)
#include<fstream>
#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],val,ad;
int Dp[25];
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);
P[++m]=n+1;
for(i=0; i<m; i++)
{
if(i==0)
ad=1;
else
ad=0;
nr=P[i+1]-P[i]-1;
if(nr>0)
{
if(k==1)
val=ad;
else
val=Dp[2];
for(j=3; j<=k; j++)
Dp[j-2]=Dp[j];
Dp[k-1]=ad;
Dp[k]=(val+Dp[k-1])%MOD;
if(nr>1)
{
for(j=1; j<=k; j++)
A[j]=Dp[j];
put(nr-1);
for(j=1; j<=k; j++)
Dp[j]=A[j];
}
}
else
{
for(j=2; j<=k; j++)
Dp[j-1]=Dp[j];
Dp[k]=ad;
}
}
fo<<Dp[k]<<"\n";
fi.close();
fo.close();
return 0;
}