const int inf = 0x3f3f3f3f;
const int maxn = 1009;
const int mod = 2005;
const double esp = 1e-6;
int x[5][5]={
{1, 1, 0, 0, 0},
{0, 0, 1, 1, 0},
{0, 0, 0, 1, 1},
{1, 0, 0, 0, 1},
{0, 0, 0, 0, 2}};
int init[5]={1, 1, 1, 1, 0};
int ans[5][5];
int tmp[5][5];
void mulans()
{
int b[5][5];
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
b[i][j] = 0;
for(int k=0; k<5; k++)
{
b[i][j] += ans[i][k]*tmp[k][j];
b[i][j] %= mod;
}
}
}
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
ans[i][j] = b[i][j];
}
}
void multmp()
{
int b[5][5];
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
b[i][j] = 0;
for(int k=0; k<5; k++)
{
b[i][j] += tmp[i][k]*tmp[k][j];
b[i][j] %= mod;
}
}
}
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
tmp[i][j] = b[i][j];
}
}
int main()
{
int n;
while(~scanf("%d", &n))
{
if(n==1) {cout<<2<<endl;continue;}
n -= 2;
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
tmp[i][j] = x[i][j];
ans[i][j] = i==j;
}
}
while(n)
{
//cout<<n<<endl;
if(n&1) mulans();
multmp();
n/=2;
}
int over[5]={0};
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
over[i] = (over[i]+ans[i][j]*init[j])%mod;
}
//cout<<i<<' '<<over[i]<<endl;
}
printf("%d\n", (over[0]+over[1]+over[2]+over[3])%mod );
}
return 0;
}
POJ-2440-矩阵
最新推荐文章于 2018-08-10 14:34:00 发布