hdu 1143 递推 + 矩阵快速幂做法

Tri Tiling(递归)骨牌的提升 Tri Tiling(递归)骨牌的提高版 Description In how many wayscan you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a3x12 rectangle.    Input Input consistsof several test cases follo 阅读详情

HDU 1143

递推过程(转)

转:::,如果n为奇数,必然无解。
当n为偶数时,一个比较直观的思路就是把大矩形用竖线切出左边一部分,然后递归求解,就像UVA_10359那样,直接考虑最左边一个小矩形是如何构成的我们就可以递归得到f(n)递推式。
虽然这个题目乍看上去小矩形似乎拼法比较多,而且要拼出一个不能再用竖线切分的小矩形似乎拼的方法也并不直观。但如果我们在纸上多画一画的话,对于拼任意一个横向边长为x的不可再用竖线切分的小矩形,如果x为2,显然有3种拼法,如果x为大于2的偶数,那么只有2种拼法。
至于如果x>2为什么只有两种拼法,我们不妨实际拼一下。首先第一列肯定只有两种情况,第一种是一个横的在上面,然后一个竖的在左下方,第二种是一个横的在下面,然后一个竖的在左上方,因为两种情况对称,我们只讨论第一种情况。
现在已经拼好两个了,如果横的下面再放一个竖的,那么显然这个就成了一个x=2的小矩形了,那么最后拼出来的就不符合我们前面说的不可再用竖线切分的特征了,因此横的下面也即竖的右边,只能再放两个横的,放完两个横的我们就发现两个横的上面有一个小正方形区域,这个区域只能楔进去一个横的,等把这个横的画完之后,My God,我们会发现一个惊人的事实,现在的这个结构是和我们最初放完一个横的一个竖的的那种情况的结构是一样的!因此,如果我们想继续向右拼出不能被竖线切分的矩形,那么只能是重复之前的操作,因而得到的最后横向边长为x的矩形是唯一确定的。
前面我们最初拼的时候只取了对称的两种情况之一,因此,如果x>2,拼出一个不能被竖线切割的矩形的方法只有两种。
那么递推公式自然就有了,f(n)=3*f(n-2)+2*f(n-4)+…+2*f(0),然后再写出f(n-2)的递推式后两式作差就可以得到f(n)=4*f(n-2)-f(n-4),递归的边界是f(0)=1,f(2)=4, f(4) = 11。

构造矩阵

{F(n), F(n - 2), F(n - 4)} = {F(n - 2), F(n - 4), F(n - 6)} * {{4, -1, 0}, {1, 0, 0}, {0, 1, 0}} ^ [(n - 4)/ 2] (n >= 6)
其实这题递推就可以A掉, 这个只是矩阵快速幂的解法。
如果n为奇数直接输出0。

总结

  1. 递推需要耐心, 而且逻辑方向要选准
  2. 啊上课推公式真的好蠢, 下次要注意了
/*
adrui's submission
Language : C++
Result : Accepted
Love : ll
Favorite : Dragon Balls

Standing in the Hall of Fame
*/



#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

#define debug 0
#define LL long long
#define M(a, b) memset(a, b, sizeof(a))

int n;

struct Matrix {
    int mat[3][3];
    void init() {
        M(mat, 0);
        for (int i = 0; i < 3; i++)
            mat[i][i] = 1;
    }
};

Matrix operator * (Matrix a, Matrix t) {                //矩阵乘法
    Matrix c;
    M(c.mat, 0);

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
        {
            for (int k = 0; k < 3; k++)
                c.mat[i][j] += a.mat[i][k] * t.mat[k][j];
        }

    return c;
}
Matrix operator ^ (Matrix tmp, int b) {                    //快速幂
    Matrix res;
    res.init();

    while (b) {
        if (b & 1) res = res * tmp;
        tmp = tmp * tmp;
        b >>= 1;
    }

    return res;
}
int main() {
#if debug
    freopen("in.txt", "r", stdin);
#endif //debug

    int f[] = { 1, 3, 11};
    while (~scanf("%d", &n), ~n) {
        Matrix tmp;
        M(tmp.mat, 0);                                        //构造底数矩阵
        tmp.mat[0][0] = 4;
        tmp.mat[0][1] = -1;
        tmp.mat[1][0] = 1;
        tmp.mat[2][1] = 1;
        if (n & 1)
            puts("0");
        else {
            if (n <= 4) {
                printf("%d\n", f[n / 2]);
            }
            else {
                Matrix res = tmp ^ ((n - 4) >> 1);                                //快速幂
                int ans = 11 * res.mat[0][0] + 3 * res.mat[0][1] + res.mat[0][2];
                printf("%d\n", ans);
            }
        }//ans
    }
    return 0;
}
【知识点】快速幂与矩阵快速幂 快速幂和快速矩阵的基本概念。 阅读详情

相关推荐

Windows 本地安装 OpenClaw(龙虾)完整教程(纯净无广告)

《Windows系统OpenClaw本地AI网关安装指南》 本文提供Windows 10/11系统下OpenClaw(龙虾)AI网关的完整部署教程,包含: 环境配置:Node.js安装验证 核心安装:npm全局部署OpenClaw 模型对接:以DeepSeek为例配置API 扩展功能:飞书机器人集成方法 日常管理:启停命令/Web面板访问 卸载清理:完整移除服务与残留 教程涵盖初始化配置、技能管理、常见问题排查,特别说明管理员权限要求及飞书配对流程,适合新手30分钟内完成本地AI网关搭建。通过命令行操作与W

qiuxunbin_csdn的博客 638

Tri Tiling(递推)

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2065&cid=1158 View Code #include<stdio.h> int main() { int n, i ; int f[31] ; while(scanf("%d", &n)!=EOF) { ...

weixin_34075268的博客 266

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4658

图形啦啦啦

对于 10% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10,a1 = a2 = a3。对于所有评测用例,1 ≤ T ≤ 1000,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 100。对于 30% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10。对于 60% 的评测用例,1 ≤ T ≤ 10,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 20。【评测用例规模与约定】

weixin_67214433的博客 107

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6890

100天精通Python(基础篇)——第4天:数据类型全解析_从基础到转换

数据类型全解析_从基础到转换

努力让自己发光,对的人才能迎着光而来 11万+

Tri Tiling

Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle.   Input consists of several test cases followed by a line contain

菲菲家的吴先森 917

012、乘累加单元(MAC):NPU中最基本的计算单元

本文深入剖析了神经网络处理器(NPU)中的核心计算单元——乘累加单元(MAC)。作者通过实际调试案例揭示了MAC单元设计中的关键问题:定点数格式对齐、累加器位宽陷阱、流水线优化和多MAC同步方案。重点讨论了INT8量化中的边界条件处理、偏置项截断风险以及零值检测等实战经验,并提供了三点实用建议:建立精确的C模型、参考RISC-V P扩展指令集、仔细审查芯片规格书。文章强调硬件加速的实际瓶颈往往在于数据搬运而非计算单元本身,为NPU开发者提供了宝贵的工程实践参考。

m0_50546716的博客 298

POJ 2663 Tri Tiling(完美覆盖)

描述一张普通的国际象棋棋盘,它被分成 8 乘 8 (8 行 8 列) 的 64 个方格。设有形状一样的多米诺牌,每张牌恰好覆盖棋盘上相邻的两个方格,即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么,是否能够把 32 张多米诺牌摆放到棋盘上,使得任何两张多米诺牌均不重叠,每张多米诺牌覆盖两个方格,并且棋盘上所有的方格都被覆盖住?我们把这样一种排列称为棋盘被多米诺牌完美覆盖。这是一个简

不若乘风来 4878

在 SAP S/4HANA 本地部署和私有云里预览 RAP Travel App:为什么 ADT 发不出去,以及如何用 /IWFND/V4_ADMIN 正确发布 OData V4 Service

在SAP S/4HANA On-Premise/Private Cloud环境中,通过ADT直接发布RAP服务的本地端点常会失效。这是因为系统治理策略要求必须通过SAP Gateway Foundation(事务码/IWFND/V4_ADMIN)发布Service Group,而非开发者本机测试模式。本文详解了该流程的必要性:Service Group是OData V4服务的发布单元,涉及后端登记(/IWBEP/V4_ADMIN)和前端发布(/IWFND/V4_ADMIN)两个环节。提供了从ADT跳转SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 266

MIKE水动力笔记7_实测数据与模型输出结果的拟合对比

上一博文【MIKE水动力笔记6】主要讲解如何自己制作实测数据的时间序列文件dfs0,而本博文讲解如何进行实测数据与模型输出结果的拟合对比。

晏长街的博客 1万+

【计算理论与算法分析设计】 6. Tri Tiling (HDU-1143) (POJ-2663)

Tri Tiling Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle. Input Input consists of several test cases followed by a line containing -1. Each test case is a line containing an intege

aanonymouss的博客 772

MFC属性网格控件(CMFCPropertyGridCtrl)完全指南:构建专业属性编辑界面

本文详细介绍了MFC中的CMFCPropertyGridCtrl控件的使用方法。主要内容包括:控件基础用法(初始化、添加属性、事件处理)、高级设置(自定义外观、创建属性类型、动态更新)、派生类实现(自定义绘制、搜索过滤功能)、界面集成技巧(对话框布局、属性编辑器)以及实际应用示例。文章重点讲解了如何通过继承和自定义实现复杂功能,并提供了性能优化、多语言支持等最佳实践方案。该控件适用于需要大量参数配置的应用程序,能够创建类似Visual Studio属性窗口的专业界面。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 154

HihoCoder 1151 矩阵快速幂 + 取模

传送门:HihoCoder 1151题解 题意 + 递推 同HDU 1143 传送门: HDU 1143解题报告坑点 因为这题n值比较大, 所以和HDU 1143不同, 必须用快速幂取模, 而使用快速幂加速的时候, 因为递推公式有-1的因子, 所以最终求的ans 可能为负值, 如果为负值, 要加上模数才对code: /* adrui's submission Language : C++

退役ACMer 954

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

快速幂 矩阵快速幂

前言:好像没啥好写的,链接可能还没有更新完 快速幂 快速幂,用于解决当n很大时的情况。通常与取模同时应用。 用最笨的方法求,即。时间复杂度为,而快速幂(附带取模),可以将时间复杂度降低为。 利用倍增的思想,例如,等于,又等于,即,如果n为奇数,,那么换成代码就是: ll Powermod(ll a,ll b) { ll ans=1; a=a%mod; while(b>0) { if(b%2==1) ans=(ans*a)%...

issey的博客 8275

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【动态规划】Tri Tiling(画方块)+ P1472 奶牛家谱 Cow Pedigrees

题目描述:   首先,我们先假设一下是2*n的正方形,得到启发: 2*2的组成情况,和2*3的组成情况。 可以知道2*2要么全是竖着要么全是横着(有2种)   要么是把自己的上一个切了一半儿的 每一次新增一排新的2*1,要么增加了一种(f[i-1]*1),要么增加的是半个,就是f[i-2] 如果这半个当做两个横着来统计的话,实际上已经在前面就计算过了,包含,所以不用管,f[i-2...

lx233 767

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法笔记(一)——Tri Tiling递推思路(杭电1143)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1143 思路分析:        1) 很容易发现当n是奇数时,结果是0,。(面积法:3*n是一个奇数,奇数不可能由多个偶数1*2相加得到)        2) 当n是偶数时,我们将3*n的区域用一条竖线分割成左右两个区域,右边区域记为3*k(2&lt;=k&lt;=n-2),而且右边区域不能被 ...

ぞ落影彡琉璃ぉ的博客 440

Tri Tiling(hdu1143)

Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2731    Accepted Submission(s): 1547 Problem Description In how many w...

weixin_34121282的博客 147

递推算法:PKU2506Tiling

这道题目的话我也看了别人写的,感觉写的都太复杂了,有七八十行 其实我们只要找出其中的规律:第n个数=第n-1个数+第n-2个数+n-2个数 然后再高精加加起来就行了。。 #include<bits/stdc++.h> using namespace std; int a[260][1000]; int len=1;//一共有多少位 int main() { a[1][1]=1; a[2][1]=3; for(int i=3; i<=250; i++) { for(in..

absWC的博客 463

1121. Tri Tiling

<br />显然 n 为奇数时,无法拼成。<br /><br />2*3 有3种排法,设f[n]为方案数,显然可以从前一个状态得到 f[n-2]*3 个排列。<br />通过观察,比较麻烦的是除了从 f[n-2] 能排出 f[n],另外一种情况是 f[n-2]再加上2格突出(如上图)。此时有2种排法能拼出 f[n](因为这两格突出可以上下翻转,共两种情况)。<br /> <br />所以我定义了两个数组,re 和unre,分别代表规则的3*n矩形的排列数和不规则(多出2格)矩形的排列数(后者不考虑上下翻转的

ACM 【程式=演算法+資料結構】@蜡笔小轩V 2282

2663 Tri Tiling 完美覆盖,样例分析+详细题解-只需10行代码

描述 一张普通的国际象棋棋盘,它被分成 8 乘 8 (8 行 8 列) 的 64 个方格。设有形状一样的多米诺牌,每张牌恰好覆盖棋盘上相邻的两个方格,即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么,是否能够把 32 张多米诺牌摆放到棋盘上,使得任何两张多米诺牌均不重叠,每张多米诺牌覆盖两个方格,并且棋盘上所有的方格都被覆盖住?我们把这样一种排列称为棋盘被多米诺牌完美覆盖。这是一...

csyifanZhang的博客 1003

矩阵快速幂(新手做法)

相当于把矩阵看成‘2’,然后算2n。当然实际上这个2是一个矩阵。换汤不换药哈。//这里默认矩阵的行列都是10,可以自己改,只是为了方便(默认n*n阶矩阵) struct Matrix {Matrix() //默认构造函数 {i

m0_60343477的博客 1226
上一篇: UVA 10689 矩阵快速幂 + 快速幂取模
下一篇: 状态调整
数论只会GCD
博客等级 码龄11年 229粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值