HDU-2604-Queuing(矩阵优化递推公式)

该博客讨论了如何计算长度为L的E-queues(非O-queue)的数量,其中队列由f(女性)和m(男性)组成。通过定义递推公式并利用矩阵快速幂的方法,博主提供了求解此类问题的编程解决方案。输入包含队列长度L和M,输出是E-queues的数量对M取余的结果。

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

题目传送门
队列和优先级队列是大多数计算机科学家都知道的数据结构。排队在我们的日常生活中经常发生。午餐时间有许多人排队。

现在我们定义f是女性的缩写m是男性的缩写。如果队列长度为L,则有2L个队列。例如,如果L = 2,那么它们是ff mm fm mf。如果存在fmf或fff这样的子队列,我们称它为O-queue,否则它是一个E-queue。

您的任务是通过编写程序计算E-queues的数量,将M与长度L取余。

输入
输入长度L (0 <= L <= 10 [sup]6[/sup])和M。

输出
输出K对M(1 <= M <= 30)取余,其中K是长度为L的e队列数。

题解:
公式 f[n]=f[n-1]+f[n-3]+f[n-4];
当最后一个为m时 ——————————f[n-1];
最后一个为f时
fmm ————————————————f[n-3];
ffm 这种情况则必须为ffmm——————f[n-4];

搞一个矩阵快速幂就行了

#include <cstring>
#include <iostream>
#include <cstdio>
#define  m(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N=10;
struct mat{
   
   ll a[N][N];};
ll n,mod;
mat mat_mul(mat x,mat y)
{
   
   
    mat res;
    m(res.a,0);
    for(int i=1;i<=4;i++)
        for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值