矩阵快速幂——HDU 2604

对应HDU题目:点击打开链接

Queuing

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3114    Accepted Submission(s): 1419

Problem Description

Queues and Priority Queues are data structures which are known to most computer scientists. The Queue occurs often in our daily life. There are many people lined up at the lunch time.

Now we define that ‘f’ is short for female and ‘m’ is short for male. If the queue’s length is L, then there are 2L numbers of queues. For example, if L = 2, then they are ff, mm, fm, mf . If there exists a subqueue as fmf or fff, we call it O-queue
else it is a E-queue.

Your task is to calculate the number of E-queues mod M with length L by writing a program.

Input

Input a length L (0 <= L <= 10 6) and M.

Output

Output K mod M(1 <= M <= 30) where K is the number of E-queues with length L.

Sample Input

3 8
4 7
4 8

Sample Output

6
2
1

题意:队伍里面有f和m, 对于长度为L的队伍,可组成这样的队伍:fm, mf, mm, ff。如果存在 fmf 或 fff 这样的子队伍,就称队伍为O-queues,否则为E-queues。问长度为L的队伍里E-queues的数目模M是多少。

思路:引用别人解释:

用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1);

如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff,其中fff和fmf不满足题意所以我们不考虑,但是如果是

mmf的话那么前n-3可以找满足条件的即:f(n-3);如果是mff的话,再往前考虑一位的话只有mmff满足条件即:f(n-4)

所以f(n)=f(n-1)+f(n-3)+f(n-4),递推会跪,可用矩阵快速幂

构造一个矩阵:

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

int f[5], mod;

typedef struct
{
    int a[4][4];
}Matrix;

Matrix A, B;

void Init()
{
    int i,j;
    memset(A.a, 0, sizeof(A));
    memset(B.a, 0, sizeof(B));
    for(i=0; i<4; i++) B.a[i][i] = 1;
    A.a[0][0] = 1;
    A.a[0][2] = 1;
    A.a[0][3] = 1;
    A.a[1][0] = 1;
    A.a[2][1] = 1;
    A.a[3][2] = 1;
}

Matrix Matrix_mul(Matrix X, Matrix Y)
{
    Matrix tmp;
    memset(tmp.a, 0, sizeof(tmp));
    int i,j,k;
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            for(k=0; k<4; k++){
                tmp.a[i][j] += (X.a[i][k] * Y.a[k][j]) % mod;
                tmp.a[i][j] %= mod;
            }
    return tmp;
}

void Solve(int n)
{
    while(n)
    {
        if(n & 1) B = Matrix_mul(B, A);
        A = Matrix_mul(A, A);
        n >>= 1;
    }
}

int main()
{
    //freopen("in.txt", "r", stdin);
    int n;
    while(~scanf("%d%d", &n, &mod))
    {
        Init();
        f[1] = 2 % mod;
        f[2] = 4 % mod;
        f[3] = 6 % mod;
        f[4] = 9 % mod;
        if(n <= 4){
            printf("%d\n", f[n]);
            continue;
        }
        Solve(n - 4);
        int i;
        int ans = 0;
        for(i=0; i<4; i++)
            ans += (B.a[0][i] * f[4 - i]) % mod;
        ans %= mod;
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-10-11 08:02:40

矩阵快速幂——HDU 2604的相关文章

递推+矩阵快速幂 HDU 2065

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 //矩阵大小上限 8 const int SIZ=100; 9 int MOD=100; 10 11 //矩阵大小为n*m,初始化全部为0 12 struct mat 13 { 14 int n,m; 15 int ar[SIZ][SIZ]; 16 mat() 17 { 18 memset

[矩阵快速幂] hdu 5015 233 Matrix

之前各种犯傻 推了好久这个东西.. 后来灵关一闪  就搞定了.. 矩阵的题目,就是构造矩阵比较难想! 题意:给出一个矩阵的第一列和第一行(下标从0开始),(0,0)位置为0, 第一行为,233,2333,23333...一次加个3, 第一列为输入的n个数. 然后从(1,1)位置开始,等于上面的数加左边的数,问(n+1,m+1)的数是多少,也就是右下角的数 思路: 把矩阵画出来: |   0     233   2333  | |  b0     b1     b2     | |  c0    

矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Google Codejam Round 1A的C题. #include <bits/stdc++.h> typedef long long ll; const int N = 5; int a, b, n, mod; /* *矩阵快速幂处理线性递推关系f(n)=a1f(n-1)+a2f(n-2)+.

矩阵快速幂 [HDU 4549] M斐波那契数列

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1609    Accepted Submission(s): 460 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,

[矩阵快速幂] hdu 3936 FIB Query

题意: 求定义y(x)=4*x-1 给L.R求 fib(y(L))~fib(y(R))的和 思路: 和之前做的一道题类似. 定于Fib为 1 1 1 0 我们的第一项就是x=1时的 就是Fib^3 然后下一项其实就是fib(3+4)=Fib^3*Fib^4 所以递推矩阵就是Fib^4 然后求和利用快速的求法 设 Fib E 0    E 这样运算N次右上角的矩阵就是我们要的和的矩阵了 然后就是答案了~! 代码: #include"cstdlib" #include"cstdi

[矩阵快速幂] hdu 3893 Drawing Pictures

题意: 给长度N的格子,有六种颜料ABCDEF, 要求涂满N个格子的方案数,并且保证是对称的,并且相邻的格子颜色不同,并且不出现ABCDEF这个序列. 思路: 受到中午那题,思维大开 首先因为颜色相邻不能相同且要对称,所以N为偶数答案为0. 接着先假设有这六种状态0(代表没颜色限制),A,AB,ABC,ABCD,ABCDE 然后初始状态为(5,1,0,0,0,0)两两之间构成转换关系 结果提交WA了 发现这题真是丧心病狂 如果是这样FEDCBABCDEF 这样对称的话就会跪 所以还有5个状态 F

[矩阵快速幂] hdu 4990 Reading comprehension

题意: 初始值为零,后面奇数项成二加一,偶数项乘二. 思路: 其实区别就在于这个加一. 就是构造一个-1每次相成,然后1-1+1就ok了. 就是 |  -1   1   0  | | -1  1  0 | * |   0   1   1  |  =  | 1  0  1 | |   0   0   2  | 依次类推就好了. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #inc

hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定要矩阵快速幂.然后立马GG. 用2代表m,1代表f.设dp[i][j][k]表示,在第i位,上一位站了的人是j,这一位站的人是k,的合法情况. 递推过去就是,如果j是1,k是2,那么这一位就只能放一个2,这个时猴dp[i][k][2] += dp[i - 1][j][k]; 其他情况分类下就好,然后

HDU 2604 Queuing (矩阵快速幂)

HDU 2604 Queuing (矩阵快速幂) ACM 题目地址:HDU 2604 Queuing 题意: n个人排队,f表示女,m表示男,包含子串'fmf'和'fff'的序列为O队列,否则为E队列,有多少个序列为E队列. 分析: 矩阵快速幂入门题. 下面引用巨巨解释: 用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1): 如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff