骨牌覆盖(矩阵快速幂)

题目链接
hiho提示;里面说的很清楚了,看不懂的话就去做一做骨牌覆盖的前两道题,理解起来好理解一些;

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int mod=12357;
int N;
int n,k;
struct zp
{
    int arr[1<<7][1<<7];
}M;
zp jx(zp a,zp b)
{
    zp res;
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
        res.arr[i][j]=0;
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
            for(int k=0;k<N;k++)
        res.arr[i][j]=(res.arr[i][j]+a.arr[i][k]*b.arr[k][j])%mod;
        return res;
}
zp jk(zp a,int b)
{
    zp res;
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
        res.arr[i][j]=(i==j);
    while(b)
    {
        if(b&1)
            res=jx(res,a);
        a=jx(a,a);
        b>>=1;
    }
    return res;
}
void dfs(int x,int y,int l)//得到转移的矩阵
{
    if(l==k)
    {
        M.arr[x][y]++;
        return ;
    }
    dfs((x<<1)+1,y<<1,l+1);//x不放
    dfs(x<<1,(y<<1)+1,l+1);//x竖着放
    if(l+2<=k)
        dfs((x<<2)+3,(y<<2)+3,l+2);//x横着放
}
int main()
{
    while(~scanf("%d%d",&k,&n))
    {
        if((n&1)&&(k&1))//奇数不可能有解
        {
            printf("0\n");
            continue;
        }
        N=1<<k;
        memset(M.arr,0,sizeof(M.arr));
        dfs(0,0,0);
        zp res=jk(M,n);
        printf("%d\n",res.arr[N-1][N-1]%mod);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值