问题
http://hihocoder.com/contest/hiho42/problem/1
3*n
解法
推到状态转移矩阵,然后转换为矩阵幂次。
#include <bits/stdc++.h>
using namespace std;
int m[32][8][8];
int d[8][8];
const int mod= 12357;
void mul(int C[8][8], int a[8][8], int b[8][8])
{
int c[8][8];
for(int i=0; i<8; ++i)
{
for (int j=0; j<8; ++j)
{
c[i][j] = 0;
for (int k=0; k<8; ++k)
{
long long t = a[i][k]* b[k][j]%mod + c[i][j];
c[i][j] = (int)(t%mod);
}
}
}
memcpy(C, c, sizeof(c));
}
int main()
{
int n;
scanf("%d", &n);
memset(m, 0, sizeof(m));
for (int i=0; i<8;++i)
m[0][i][7-i] = 1;
m[0][7][3] = m[0][3][7] = 1;
m[0][7][6] = m[0][6][7] = 1;
for (int i=1; i<32; ++i)
mul(m[i], m[i-1], m[i-1]);
memset(d, 0, sizeof(d));
for(int i=0; i<8; ++i)
d[i][i] = 1;
for(int i=0; i<32&& n; ++i, n>>=1)
{
if (n&0x01){
mul(d, d, m[i]);
}
}
printf("%d\n", d[7][7]);
return 0;
}