51NOD2000 - 四边形分割平面(使用矩阵求通项公式)

本文详细解析了一种通过叠加正方形来最大化分隔区域数量的问题,并给出了两种解决方案:一种是使用递推公式进行预计算,另一种是通过数学推导得出直接公式。同时,还介绍了如何运用矩阵快速幂的方法求解该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题挺有意思的,和HDU5047 - Sawtooth[找规律]的类型是一样的,关键问题在于你要知道如何分割使得区域个数最多以及求出递推公式或直接公式。

题目链接:点这儿

我们先来看一张图,看看如何叠加正方形使得分隔的区域数最多。
这里写图片描述

这么叠加会生成最多的分隔区域,具体分析可以参考HDU5047 - Sawtooth[找规律]

因此可以得到递推式: Fn=Fn1+8(n1) F n = F n − 1 + 8 ( n − 1 )

由于这个题的数据量不大,因此可以打表输出就行。

#include <bits/stdc++.h>

using namespace std;

const int maxn = 10001;

int f[maxn];

void init()
{
    f[1] = 2;
    for (int i = 2; i < maxn; ++i)
        f[i] = f[i - 1] + 8 * (i - 1);
}

int main()
{
    init();
    int T;
    scanf("%d", &T);
    for (int n; T--; ) {
        scanf("%d", &n);
        printf("%d\n", f[n]);
    }
    return 0;
}

或者利用迭代(同样参见HDU5047 - Sawtooth[找规律])求出最终公式: Fn=2+4n(n1) F n = 2 + 4 n ( n − 1 )

其实我一开始没有想到迭代这一做法,我的最直接想法竟然是矩阵快速幂,因此这里我把我一开始的做法分享一下。

这个公式 Fn=2+4n(n1) F n = 2 + 4 n ( n − 1 ) 可以得到一个矩阵等式

100110081n1×F181=100110081×Fn18(n1)1=Fn8n1 [ 1 1 0 0 1 8 0 0 1 ] n − 1 × [ F 1 8 1 ] = [ 1 1 0 0 1 8 0 0 1 ] × [ F n − 1 8 ( n − 1 ) 1 ] = [ F n 8 n 1 ]

具体详情可以参加博文深入浅出矩阵快速幂及其简单应用

现在的问题就变成了

100110081n1=? [ 1 1 0 0 1 8 0 0 1 ] n − 1 = ?

A=100110081,B=000100080 A = [ 1 1 0 0 1 8 0 0 1 ] , B = [ 0 1 0 0 0 8 0 0 0 ]


A=E+BB2=000000800,B3=B4==Bn=000000000 A = E + B , B 2 = [ 0 0 8 0 0 0 0 0 0 ] , B 3 = B 4 = ⋯ = B n = [ 0 0 0 0 0 0 0 0 0 ]

所以

An1=(E+B)n1=En1+(n1)En2B+(n1)(n2)2B2=100n1104(n1)(n2)8(n1)1 A n − 1 = ( E + B ) n − 1 = E n − 1 + ( n − 1 ) E n − 2 B + ( n − 1 ) ( n − 2 ) 2 B 2 = [ 1 n − 1 4 ( n − 1 ) ( n − 2 ) 0 1 8 ( n − 1 ) 0 0 1 ]

Fn=F11+8(n1)+4(n1)(n2)1=2+4n(n1) F n = F 1 ∗ 1 + 8 ∗ ( n − 1 ) + 4 ( n − 1 ) ( n − 2 ) ∗ 1 = 2 + 4 n ( n − 1 )

我一开始就是这么做的!也好,给自己开阔了一个新的求通项公式的路子,也复习了线性代数。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int T;
    scanf("%d", &T);
    for (int n; T--; ) {
        scanf("%d", &n);
        printf("%d\n", 2 + 4 * n * (n - 1));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值