Pagini recente » Cod sursa (job #2419897) | Cod sursa (job #2980444) | Cod sursa (job #65269) | Cod sursa (job #426369) | Cod sursa (job #2040895)
#include <bits/stdc++.h>
#define Nmax 25
#define Mmax 1005
#define MOD 9901
using namespace std;
ifstream f("pod.in");
ofstream g("pod.out");
int n,m,K;
int add[Nmax][Nmax];
int b[Nmax][Nmax];
int sol[Nmax][Nmax];
int dp[Nmax];
int gap[Mmax];
inline void read()
{
f>>n>>m>>K;
for(int i=1;i<=m;i++)
f>>gap[i];
}
inline void mult(int a[Nmax][Nmax],int b[Nmax][Nmax])
{
int aux[Nmax][Nmax];
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
{
aux[i][j]=0;
for(int k=1;k<=K;k++)
aux[i][j]+=a[i][k]*b[k][j];
}
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
a[i][j]=aux[i][j]%MOD;
}
inline void mat_pow(int p)
{
for(int i=1;i<K;i++)
{
for(int j=1;j<=K;j++) add[j][i]=0;
add[i+1][i]=1;
}
for(int i=1;i<=K;i++) add[i][K]=0;
add[1][K]=add[K][K]=1;
for(int i=0;p>>i;i++)
{
if(((p>>i)&1)) mult(sol,add);
mult(add,add);
}
}
inline void solve()
{
sort(gap+1,gap+m+1);
gap[++m]=n+1;
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
if(i==j) sol[i][j]=1;
for(int i=1;i<K;i++) b[i+1][i]=1;
for(int i=1;i<=m;i++)
{
mat_pow(gap[i]-gap[i-1]-1);
if(i<m) mult(sol,b);
}
g<<sol[K][K];
}
int main()
{
read();
solve();
return 0;
}