Pagini recente » Istoria paginii utilizator/pinmelissa05 | Cod sursa (job #497844) | Cod sursa (job #184544) | Cod sursa (job #2355247) | Cod sursa (job #2241543)
#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];
for(i=1; i<=k; i++)
for(j=1; j<=k; j++)
{
A[i][j]=Aux[i][j];
if(A[i][j]>=MOD)
A[i][j]%=MOD;
}
}
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]);
for(i=1; i<=k; i++)
{
B[i]=Aux[i][1]%MOD;
if(B[i]>=MOD)
B[i]%=MOD;
}
}
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]);
if(Dp[k]>=MOD)
Dp[k]-=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;
}