Pagini recente » Cod sursa (job #2824116) | Cod sursa (job #720148) | Cod sursa (job #2345519) | Cod sursa (job #1963360) | Cod sursa (job #467170)
Cod sursa(job #467170)
#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
#define MOD 9901
int N,M,K,rez,unu, nr,aux,tot;
int v[1001];
//bitset<1000021> viz;
bool viz[1000021];
void caz0(int N)
{
int i;
rez=1;
if (N>1)
rez+=N-K+1;
if (rez>=MOD)
rez%=MOD;
for (i=2; i*K<=N; ++i)
{
unu=N-i*K;
if (unu!=1&&unu)
{
nr=unu+i;
aux=((nr%MOD)*((nr-1)%MOD))/2;
if (aux>=MOD)
aux%=MOD;
rez+=aux;
if (rez>=MOD)
rez-=MOD;
}
else
if (unu&&K!=N-1)
{
rez+=N/K+1;
if (rez>=MOD)
rez%=MOD;
}
else
{
++rez;
if (rez>=MOD)
rez-=MOD;
}
}
}
void back(int p)
{
if (p>v[M])
{
caz0(N-p);
tot+=rez;
if (rez>=MOD)
rez-=MOD;
return;
}
if (!viz[p+1])
back(p+1);
if (!viz[p+K])
back(p+K);
}
int main()
{
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
scanf("%d%d%d",&N,&M,&K);
for (int i=1; i<=M; ++i)
scanf("%d",&v[i]);
if (M==0)
{
caz0(N);
printf("%d",rez);
return 0;
}
sort(v+1,v+1+M);
if (v[M]<=1000000)
{
for (int i=1; i<=M; ++i)
viz[v[i]]=1;
}
back(0);
printf("%d",tot);
return 0;
}