poj 3734 Blocks 矩阵
2013-08-23 20:10
387 查看
#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> #include <iostream> using namespace std; #define LL long long const int m=4; const int mod=10007; int a[4][4]={ {2,1,1,0}, {1,2,0,1}, {1,0,2,1}, {0,1,1,2} }; struct matrix{ int f[4][4]; }; matrix mul(matrix a,matrix b) { int i,j,k; matrix c; memset(c.f,0,sizeof(c.f)); for(k=0;k<m;k++) { for(i=0;i<m;i++) { if(!a.f[i][k])continue; for(j=0;j<m;j++) { if(!b.f[k][j])continue; c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[j][k])%mod; } } } return c; } matrix pow_mod(matrix a,int b) { matrix s; memset(s.f,0,sizeof(s.f)); for(int i=0;i<m;i++) s.f[i][i]=1; while(b) { if(b&1) s=mul(s,a); a=mul(a,a); b=b>>1; } return s; } int main() { int T; cin>>T; while(T--) { int n; cin>>n; matrix e; memcpy(e.f,a,sizeof(a)); e=pow_mod(e,n-1); cout<<(e.f[0][0]*2+e.f[1][0]+e.f[2][0])%mod<<endl; } return 0; } /* dp[i][j][k]表示长度为i,红色个数的奇偶性j,绿色个数的奇偶性为k.j,k为1或0,表示奇和偶。 dp[i][j][k]=2*dp[i-1][j][k]+dp[i-1][1-j][k]+dp[i-1][j][1-k]; 由于n太大,需要用矩阵,所以jk用00 ,01 ,10, 11表示 则矩阵为: |dp[i-1][00] dp[i-1][01] dp[i-1][10] dp[i-1][11]|*|2 1 1 0|=|dp[i][00] dp[i][01] dp[i][10] dp[i][11]| |1 2 0 1| |1 0 2 1| |0 1 1 2| */
相关文章推荐
- POJ 3734 Blocks 生成函数及矩阵的解法
- poj 3734 Blocks【矩阵快速幂染色】
- [POJ 3734] Blocks (矩阵高速幂、组合数学)
- Poj 3734 Blocks(DP,矩阵乘法优化)
- Blocks - POJ 3734 矩阵乘法递推
- POJ_3734_Blocks_矩阵快速幂
- Poj 3734 Blocks【矩阵快速幂+递推】
- Blocks(POJ 3734 矩阵快速幂)
- poj 3734 Blocks(构造矩阵加快速幂)
- 【POJ 3734 Blocks】+ 矩阵快速幂
- POJ 3734 Blocks 矩阵快速幂
- POJ 3734 Blocks【用母函数推公式|矩阵乘法】
- 文章标题 POJ 3734 : Blocks (矩阵快速幂)
- poj 3734 Blocks(矩阵快速幂)
- POJ 3734 Blocks——矩阵快速幂
- poj 3734 Blocks 【矩阵快速幂】
- POJ 3734 Blocks(矩阵优化+DP)
- poj 3734 Blocks (递推,矩阵快速幂)
- poj 3734 Blocks (矩阵快速幂优化的动态规划)
- [POJ 3734] Blocks (矩阵快速幂、组合数学)