Pagini recente » Diferente pentru utilizator/hominidu intre reviziile 21 si 27 | Monitorul de evaluare | Diferente pentru utilizator/tudorbuhnia intre reviziile 28 si 59 | Monitorul de evaluare | Cod sursa (job #2014890)
#include<cstdio>
#include<algorithm>
using namespace std;
const int kmax=23;
const int mmax=1005;
const int mod=9901;
int a[kmax][kmax],b[kmax][kmax],terz[mmax],ans[kmax],k,c[kmax][kmax],sol[kmax];
void offline()
{
int i,j;
for(i=1; i<=k; ++i)
for(j=1; j<=k; ++j)
{
if(j==k) b[i][j] = (i==1 || i==k);
else b[i][j] = (i==j+1);
a[i][j] = (i==j);
sol[i] = 0;
}
}
inline void inm(int a1[kmax][kmax] , int a2[kmax][kmax])
{
int i,j,l;
for(i=1;i<=k;++i)
for(j=1;j<=k;++j)
{
c[i][j]=0;
for(l=1;l<=k;++l)
c[i][j] +=a1[i][l] * a2[l][j];
}
for(i=1;i<=k;++i)
for(j=1;j<=k;++j)
a1[i][j] = c[i][j] %mod;
}
inline void putere(int p)
{
while(p)
{
if(p&1)
inm(a,b);
inm(b,b);
p>>=1;
}
int i,j;
for(i=1;i<=k;++i)
for(j=1;j<=k;++j)
sol[i] += ans[j]*a[j][i];
for(i=1;i<=k;++i)
ans[i] = sol[i] % mod;
}
int main()
{
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
int n,m,i,j;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=m;++i)
scanf("%d",&terz[i]);
terz[++m]=n;
sort(terz+1,terz+m+1);
ans[k]=1;
for(i=1;i<=m;++i)
{
offline();
putere(terz[i]-terz[i-1]);
if(i != m)
ans[k]=0;
}
printf("%d",ans[k]);
}