Pagini recente » Cod sursa (job #189299) | Cod sursa (job #1720300) | Cod sursa (job #2178309) | Cod sursa (job #1156370) | Cod sursa (job #1474922)
#include<fstream>
#include<algorithm>
using namespace std;
const char iname[]="pod.in";
const char oname[]="pod.out";
const int maxk=25;
const int maxm=1005;
const int mod=9901;
typedef int matrix[maxk][maxk];
ifstream f(iname);
ofstream g(oname);
int n,m,k,i,j,p,v[maxm];
matrix a,b,c,base,z;
inline void copy(matrix b, matrix a)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
a[i][j]=b[i][j];
}
inline void copy1(matrix b, matrix a)
{
for(int i=1;i<=1;++i)
for(int j=1;j<=m;++j)
a[i][j]=b[i][j];
}
inline void mul(matrix a, matrix b, matrix c)
{
for(int i=1;i<=k;++i)
for(int j=1;j<=k;++j)
{
c[i][j]=0;
for(int t=1;t<=k;++t)
c[i][j]+=a[i][t]*b[t][j];
c[i][j]%=mod;
}
}
inline void mul1(matrix a, matrix b, matrix c)
{
for(int i=1;i<=1;++i)
for(int j=1;j<=k;++j)
{
c[i][j]=0;
for(int t=1;t<=k;++t)
c[i][j]+=a[i][t]*b[t][j];
c[i][j]%=mod;
}
}
inline void neutral(matrix a)
{
for(int i=1;i<=k;++i)
for(int j=1;j<=k;++j)
a[i][j]=(int)(i==j);
}
int main()
{
f>>n>>m>>k;
for(i=1;i<=m;++i)
f>>v[i];
sort(v+1,v+m+1);
base[1][1]=1;
z[1][1]=1;
z[k][1]=1;
for(i=2;i<=k;++i)
z[i-1][i]=1;
v[0]=0;
for(i=1;i<=m;++i)
{
int dis=v[i]-v[i-1];
neutral(a);
copy(z,b);
while(dis)
{
if(dis&1)
mul(a,b,c),copy(c,a);
mul(b,b,c);copy(c,b);
dis/=2;
}
mul1(base,a,c);
copy1(c,base);
base[1][1]=0;
}
int dis=n-v[i-1];
neutral(a);
copy(z,b);
while(dis)
{
if(dis&1)
mul(a,b,c),copy(c,a);
mul(b,b,c);copy(c,b);
dis/=2;
}
mul1(base,a,c);
g<<c[1][1]<<"\n";
}