首页 > 其他分享 >poj3420 Quad Tiling--状压dp+矩阵快速幂

poj3420 Quad Tiling--状压dp+矩阵快速幂

时间:2022-12-06 20:39:13浏览次数:68  
标签:return Mat poj3420 -- 状压 int 16 re include


原题链接:​​http://poj.org/problem?id=3420​


题意:一个4*n的格子,一个1*2的填充,求填充方式。


分析:n最大是10^9,比较大,用矩阵快速幂优化速度。


#define _CRT_SECURE_NO_DEPRECATE

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdio.h>
#define INF 99999999
#define eps 0.0001
using namespace std;

typedef long long ll;
int MOD;

struct Mat
{
ll at[16][16];

Mat()
{
memset(at, 0, sizeof(at));
}

friend Mat operator*(Mat& mat1, Mat& mat2)
{
Mat re;
for (int i = 0; i < 16; i++)
{
for (int k = 0; k < 16; k++)
{
if (mat1.at[i][k] == 0)
continue;
for (int j = 0; j < 16; j++)
{
re.at[i][j] += (mat1.at[i][k] * mat2.at[k][j]);
re.at[i][j] %= MOD;
}
}
}
return re;
}

friend Mat operator^(Mat mat, int n)
{
if (n == 1)return mat;
Mat re;
for (int i = 0; i < 16; i++)
re.at[i][i] = 1;

while (n)
{
if (n & 1)
re = re*mat;
n = n >> 1;//注意要赋值给n,右移会返回一个新值,而不会修改原值
mat = mat*mat;
}

return re;
}
};

Mat m;

void dfs(int l, int now, int pre)
{
if (l > 4)return;
if (l == 4)
{
m.at[pre][now] = 1;
return;
}

dfs(l + 2, (now << 2) | 3, (pre << 2) | 3);//横
dfs(l + 1, (now << 1) | 1, (pre << 1));//竖
dfs(l + 1, (now << 1), (pre << 1) | 1);//不放
}

int main()
{
int n;
dfs(0, 0, 0);
while (~scanf("%d %d", &n, &MOD))
{
if (n == 0 && MOD == 0)
break;
if (MOD == 1)//有点坑,当输入数据1 1 的时候不加这句就会错,其他数据都可以去掉这句代码
{
printf("0\n");
continue;
}
Mat ans = m^n;
printf("%lld\n", ans.at[15][15]);
}
return 0;
}






标签:return,Mat,poj3420,--,状压,int,16,re,include
From: https://blog.51cto.com/u_11937443/5916597

相关文章

  • poj 2663 Tri Tiling--状压dp
    原题链接:​​http://poj.org/problem?id=2663​​题意:一个3*n的表格,用一个1*2的方块填充,在填满的情况下,一共多少种填充方式。#define_CRT_SECURE_NO_DEPRECATE#include<ios......
  • poj2411 Mondriaan's Dream--状压dp
    原题链接:​​http://poj.org/problem?id=2411​​.题意:一个n*m的方格,给定一个1*2的方块,要求用这个方块填充方格,填满,一共多少种填充方法。分析:对于一行的某一列来说,该列有三......
  • poj 3254 Corn Fields--状压dp入门
    原题链接:​​http://poj.org/problem?id=3254​​题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。分......
  • hdu4705 Y--树形dp
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=4705​​题意:一棵树,求三个点不在一条线的个数。分析:注意,反过来求,求出三个点在一条线的个数,最后总数减去在一条线的......
  • hdu3899 JLUCPC--树形dp(好题)
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=3899​​题意:给定n个点,每个点的人数,n-1条边和边权。选取任意一点u,然后让所有人都移动到u点,问最小的移动距离和是多......
  • UVALive 2038 Strategic game--树形dp
    原题链接:​​http://vjudge.net/problem/UVALive-2038​​题意:一棵树,n个点,0为根,求最少的点可以覆盖所有边。分析:dp[u][0]表示u点不选;dp[u][1]表示该点选择。#defin......
  • UVALive 4015 Caves--树形dp
    原题链接:​​http://vjudge.net/problem/UVALive-4015​​题意:n个部落,编号0到n-1,n-1条路连接n个部落,连成一棵树,机器人从树根出发,问在最多走x米最多经过多少部落。分析:dp[i......
  • 语言并不是使用Serverless跨不去的门槛
    语言并不是使用Serverless跨不去的门槛我们在使用Serverless进行开发的时候,你有没有想过这个问题,Serverless支持Java,Python,NodeJS等一些主流语言,那么碰到我们不支持的语言......
  • hdu1561 The more, The Better--树形dp
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1561​​分析:建一个0点作为树根,把树连起来,dp[i][j]表示以i点为树根选择j个点的最大值。注意该题,每选择一个点......
  • UVA 10859 Placing Lampposts--树形dp
    原题链接:​​http://vjudge.net/problem/UVA-10859​​题意:给一个N个点M条边的无向无环图,就是树的意思,每个节点都可以放灯。每盏灯将照亮以它为一个端点的所有边,在所有边都......