hdu2604 矩阵快速幂

题意:      给你n个人,排成一个长度是n的队伍,人只有两类f,m,问可以有多少种排法使度列中不出现fff,fmf这样的子串。思路:      一开始暴力,结果超时了,其实这个题目要是能找到类似于斐波那契那样的公式,就可以瞬间用矩阵乘法+快速幂秒掉大数据,现在我们来找公式,我们现在来讨论当前队列的最后一个字母,如果是m那么之前的所有+m都不会冲突,所以有f(n-1)个,如果是f
摘要由CSDN通过智能技术生成
题意:
      给你n个人,排成一个长度是n的队伍,人只有两类f,m,问可以有多少种排法使度列中不出现fff,fmf这样的子串。

思路:
      一开始暴力,结果超时了,其实这个题目要是能找到类似于斐波那契那样的公式,就可以瞬间用矩阵乘法+快速幂秒掉大数据,现在我们来找公式,我们现在来讨论当前队列的最后一个字母,如果是m那么之前的所有+m都不会冲突,所以有f(n-1)个,如果是f呢?,这个时候我们要考虑不可以出现fff,fmf这样的序列,那么新形成的后缀也就只有mmf,mff可以满足了,mmf前面是什么都可以满足,所以f(n - 3),而mff还得往前找,只有mmff前面是什么都可以,这时是f(n - 4),所以最终 f(n) = f(n - 1) + f(n - 3) + f(n - 4),接下来就构造矩阵,矩阵的构造也很简单,但是构造的时候别忘了,矩阵没有交换律的。

f(x)f(x+1)f(x+2)f(x+3)  *  [ 0 0 0 1 ] =  f(x+1)f(x+2)f(x+3)f(x+4)        
                                      [ 1 0 0 1 ]
                                      [ 0 1 0 0 ]
                                      [ 0 0 1 1 ]


构造完矩阵就可以用矩阵快速幂吊打这道题了。


#include<stdio.h>
#include<string.h>

int MOD;

typedef struct
{
   
   int mat[5][5];
}A;

A mat_mat(A a ,A b)
{
   
   A c;
   memset(c.mat ,0 ,sizeof(c.mat));
   for(int k = 1 ;k <= 4 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值