Pagini recente » Arbsumpow | Istoria paginii documentatie | Meeting | Bal | Cod sursa (job #1004077)
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int N,M,K,v[1100],a[22][22],b[22][22],temp[22][22];
void mul(int A[22][22], int B[22][22])
{
int C[22][22];
for(int i=1;i<=K;++i)
for(int j=1;j<=K;++j)
C[i][j]=0;
for(int i=1;i<=K;++i)
for(int j=1;j<=K;++j)
for(int k=1;k<=K;++k)
{
C[i][j]=(C[i][j] + A[i][k]*B[k][j])%9901;
}
for(int i=1;i<=K;++i)
for(int j=1;j<=K;++j)
B[i][j] = C[i][j];
return;
}
void pow(int x, int A[22][22])
{
int B[22][22];
for(int i=1;i<=K;++i)
for(int j=1;j<=K;++j)
B[i][j]=A[i][j];
if(x==1)
return;
pow(x/2,A);
if(x%2==0)
mul(A,A);
else
{
mul(A,A);
mul(B,A);
}
}
int main()
{
//freopen("input.in","r",stdin);
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
cin>>N>>M>>K;
for(int i=1;i<=M;++i)
cin>>v[i];
sort(v+1,v+M+1);
for(int i=1;i<=K;++i)
{
b[i][K]=1;
if(i==K)
continue;
a[i+1][i]=1;
}
a[1][1]=1;
a[1][K]=1;
for(int i=1;i<=K;++i)
for(int j=1;j<=K;++j)
temp[i][j]=a[i][j];
if(!M)
{
if(N<K)
{
cout<<1;
return 0;
}
pow(N-K+1,temp);
mul(temp,b);
cout<<b[1][K];
return 0;
}
if(N<K)
{
cout<<0;
return 0;
}
if(N==K && v[1]>K)
{
cout<<2;
return 0;
}
int x=1;
if(v[x]<K)
{
while(v[x]<K && x<=M)
{
b[K-v[x]][K]=0;
++x;
}
}
if(v[x]==K && N==K)
{
cout<<0;
return 0;
}
v[0] = K;
for(int i=x;i<=M;++i)
{
pow(v[i]-v[i-1],temp);
mul(temp,b);
for(int i=1;i<=K;++i)
for(int j=1;j<=K;++j)
temp[i][j]=a[i][j];
b[1][K]=0;
}
pow(N-v[M],temp);
mul(temp,b);
cout<<b[1][K];
return 0;
}