hihoCoder 1151 : 骨牌覆盖问题·二 矩阵快速幂
2015-05-14 20:57
483 查看
#1151 : 骨牌覆盖问题·二
时间限制:10000ms单点时限:1000ms
内存限制:256MB
描述
上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢?
首先我们可以肯定,奇数长度一定是没有办法覆盖的;对于偶数长度,比如2,4,我们有下面几种覆盖方式:
提示:3xN骨牌覆盖
输入
第1行:1个整数N。表示棋盘长度。1≤N≤100,000,000
输出
第1行:1个整数,表示覆盖方案数 MOD 12357样例输入
62247088
样例输出
4037
//同1,但是起始的向量和矩阵都变化了,详细可以看hihocoder的说明; //(a, b) x M = (b, a+b) //必须用 long long #include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define M 12357 struct matrix{ long long map[8][8]; }; matrix mat,ans; void init() { int i,j,k; memset(mat.map,0,sizeof(mat.map)); for(i=0;i<8;i++) mat.map[i][7-i]=1; mat.map[3][7]=1; mat.map[6][7]=1; mat.map[7][3]=1; mat.map[7][6]=1; for(i=0;i<8;i++) for(j=0;j<8;j++) ans.map[i][j]=(i==j); } matrix mul(matrix a,matrix b) { int i,j,k; matrix c; for(i=0;i<8;i++) for(j=0;j<8;j++) { c.map[i][j]=0; for(k=0;k<8;k++) { c.map[i][j]+=(a.map[i][k]*b.map[k][j])%M; c.map[i][j]%=M; } } return c; } void pow(int n) { for(;n;n>>=1) { if(n&1) ans=mul(ans,mat); mat=mul(mat,mat); } } int main() { int n; while(scanf("%d",&n)!=EOF) { init(); pow(n); //linux: printf("%lld",a); //windows: printf("%I64d",a); //cout<<ans.map[1][1]<<endl; 对 //printf("%I64d\n",ans.map[1][1]); 错 printf("%lld\n",ans.map[7][7]);//对 } return 0; }
相关文章推荐
- 题目1 : 骨牌覆盖问题·二 (矩阵快速幂+分析状态的表示+题目的提示分析很好很经典)
- hihoCoder 1143 : 骨牌覆盖问题·一 矩阵快速幂
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
- 2015编程之美 骨牌覆盖问题·一(矩阵快速幂)
- HihoCoder1143 骨牌覆盖问题·一(矩阵快速幂,斐波那契)
- hihocoder1143 骨牌覆盖问题·一(矩阵快速幂)
- hiho一下·41 骨牌覆盖问题·一(矩阵快速幂·费波拉契)
- 2015编程之美 骨牌覆盖问题·二 (快速幂)
- hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)
- [HIHO1143]骨牌覆盖问题·一(矩阵快速幂,递推)
- 快速矩阵幂 hihoCoder1162 骨牌覆盖问题·三
- hihoCoder #1151 : 骨牌覆盖问题·二 (矩阵快速幂,DP)
- hihocoder第41周 骨牌覆盖(矩阵快速幂)
- 骨牌覆盖问题总结!hihoCoder/ NYOJ-1273宣传墙1151
- 算法-骨牌覆盖问题(矩阵快速幂求Fibonacii)
- 【hiho一下 第四十二周】骨牌覆盖问题·二
- c实现:骨牌覆盖问题·二
- 51nod 1033 骨牌覆盖 V2(矩阵快速幂)
- hihoCoder 骨牌覆盖问题·一 hiho一下 第四十一周
- 51nod 1033 骨牌覆盖 V2(矩阵快速幂)