08220420

1*2骨牌覆盖问题——zjnu1610(n<=8,m<=10^9)

这种是老题了吧

#include<iostream>
#include
<algorithm>
using namespace std;
int n, a, b, m;

struct ss {
    
int a[1 << 7][1 << 7];
} ba, x;

void dfs(int s) {
    
for (int i = 0; i < a - 1; i++) {
        
int p = 3 << i;
        
if ((s & p) == 0) {
            ba.a[m][(
~(s + p))&(n - 1)] = 1;
            dfs(s 
+ p);
        }
    }
}

ss mm(ss a, ss b, 
int k) {
    ss temp;
    
for (int i = 0; i < k; i++)
        
for (int j = 0; j < k; j++) {
            temp.a[i][j] 
= 0;
            
for (int l = 0; l < k; l++)
                temp.a[i][j] 
+= a.a[i][l] * b.a[l][j];
            temp.a[i][j] 
%= 9937;
        }
    
return temp;
}

int main() {
    
while (scanf("%d%d"&a, &b) != EOF) {
        
if (a > b)swap(a, b);
        n 
= 1 << a;
        
for (int i = 0; i < n; i++)
            
for (int j = 0; j < n; j++) {
                x.a[i][j] 
= ba.a[i][j] = 0;
                
if (i == j)x.a[i][j] = 1;
            }
        
for (m = 0; m < n; m++) {
            ba.a[m][(
~m)&(n - 1)] = 1;
            dfs(m);
        }
        
for (; b; b >>= 1, ba = mm(ba, ba, n)) if (b & 1)x = mm(x, ba, n);
        printf(
"%d\n", x.a[0][0]);
    }
}


 

据说有数学公式。。我是用矩阵做的

posted on 2010-03-20 19:01 hxyoung 阅读(344) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜