HDU2604-- Queuing(矩阵快速幂优化)

Queuing

Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

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 2 L 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 

记录dp[i][4]为队伍长度为i时的四种状态mm mf fm ff

那么(mm)dp[i][0] = dp[i-1][0] + dp[i-1][2];

(mf)dp[i][1] = dp[i-1][0] ;

(fm)dp[i][2] = dp[i-1][1] + dp[i-1][3] ;

(ff)dp[i][3] = dp[i-1][1] ;

那么就可以使用矩阵优化

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
struct node{
    int a[5][5] ;
    int n ;
};
node mul(node p,node q,int m)
{
    int i , j , k ;
    node s ;
    s.n = p.n ;
    for(i = 0 ; i < p.n ; i++)
        for(j = 0 ; j < p.n ; j++)
        {
            s.a[i][j] = 0 ;
            for(k = 0 ; k < p.n ; k++)
                s.a[i][j] = ( s.a[i][j] + p.a[i][k] * q.a[k][j] ) % m ;
        }
    return s ;
}
node pow(node p,int k,int m)
{
    if( k == 1 )
        return p ;
    node s = pow(p,k/2,m) ;
    s = mul(s,s,m) ;
    if( k%2 )
        s = mul(s,p,m) ;
    return s ;
}
int main()
{
    int i , j , l , m ;
    node p , s ;
    p.n = 4 ;
    memset(p.a,0,sizeof(p.a)) ;
    p.a[0][0] = p.a[0][1] = 1 ;
    p.a[1][2] = p.a[1][3] = 1 ;
    p.a[2][0] = 1 ;
    p.a[3][2] = 1 ;
    while( scanf("%d %d", &l, &m) != EOF )
    {
        if(l == 0 )
        {
            printf("1\n") ;
            continue ;
        }
        else if( l == 1 )
        {
            printf("2\n") ;
            continue ;
        }
        else if( l == 2 )
        {
            printf("4\n") ;
            continue ;
        }
        s = pow(p,l-2,m) ;
        int ans = 0 ;
        for(i = 0 ; i < 4 ; i++)
            for(j = 0 ; j < 4 ; j++)
                ans = ( ans + s.a[i][j] ) % m ;
        printf("%d\n", ans) ;
    }
    return 0;
}
时间: 2024-10-05 04:58:15

HDU2604-- Queuing(矩阵快速幂优化)的相关文章

hdu---(2604)Queuing(矩阵快速幂)

Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2796    Accepted Submission(s): 1282 Problem Description Queues and Priority Queues are data structures which are known to most computer

矩阵快速幂优化递推总结

RT,主要总结一下矩阵的求法. 首先能用矩阵快速幂优化的递推类型是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之类的 也就是说递推是线性递推且f[n-i]前面的系数是常数,可以含有与n有关的多项式,也可以含有常数的这种递推,下面总结一下矩阵的写法: 先考虑最简单的常数,我们其实可以忽略常数,因为顶多在没有常数的矩阵外面加一行一列就行了 以f[n]=2f[n-1]+6f[n-2]+5f[n-3]+n^2+n为例 先写迭代的矩阵,一般可以写成一行,右边有几项写几项 {f[

poj 3744 概率dp 矩阵快速幂优化

一位童子兵要穿过一条路,路上有些地方放着地雷.这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i+1 ,或者 (1-p) 的概率跳一步到 i+2.童子兵初始在1位置,求他安全通过这条道路的概率. 以所在位置为状态,dp[i] 表示在位置 i 的安全的概率. dp[i] = p * dp[i-1] + (1 - p) * dp[i-2]; // i 位置没有地雷 但是题目数据的范围是 10^8 这样dp的话会 TLE. 想想可以用矩阵快速幂优化.简单退出矩阵是 |p

hdu2604(矩阵快速幂)

题意:字符串只能由f和m两种字符构成,问长度为L且不出现子串fmf,fff的字符串有多少种. 解法:初始的矩阵应该是 mm   1 0 0 1    mm .但是因为不能出现fmf,fff子串,所以fm和ff后面不能跟f ff     0 1 1 0    ff mf    1 0 0 1    mf fm    0 1 1 0    fm 所以矩阵变化为:mm   1 0 0 1    mm ff     0 1 1 0    ff mf   1 0 0 1    mf fm   0 1 1

HDU 5863 cjj&#39;s string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但是 m 很小的时候 发现此题DP并不合适.于是想可能是某种组合数学的问题可以直接公式算 看到题解的我.恍然大悟.对于这种数据.可以考虑一下矩阵快速幂优化的DP 首先要想到线性递推的 DP 式子 最直观的想法就是 dp[i][j] = 到第 i 个位置为止.前面最长匹配长度为 j 的方案数 但是如果仔

hdoj 4062 Queuing 【矩阵快速幂优化递推公式】

Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3609    Accepted Submission(s): 1629 Problem Description Queues and Priority Queues are data structures which are known to most computer

POJ3744——概率DP 矩阵快速幂优化——Scout YYF I

http://poj.org/problem?id=3744 矩阵快速幂: 利用DP的递推式 就本题来说 dp[i] = p*dp[i-1] + (1-p)*dp[i-2] 由于x非常大最大1亿,这样的话复杂度就为1亿 所以这里可以用矩阵的思想 [dp[i]   dp[i-1] ] = [ dp[i-1]  dp[i-2] ] | p   1 - p| | 1      0  | 递推得到 n - 1 [dp[n]   dp[n-1]] = [dp[1]   dp[2] ] |p   1 - p

矩阵快速幂优化线性递推

我们熟知的斐波那契数列递推公式是: \(f(n)=f(n-1)+f(n-2)\) 假设我们需要求斐波那契数列的第n项,当n非常大(如n=1e9)的时候,递推肯定超时.我们不妨设: \(\binom{f_{n}}{f_{n-1}}=\begin{pmatrix}a & b\\ c & d\end{pmatrix}\binom{f_{n-1}}{f_{n-2}}\) 将等式右边乘开,得到: \(\binom{af_{n-1}+bf_{n-2}}{cf_{n-1}+df_{n-2}}\) 要使其

[题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你一个 n 行m 列 的格子图 一只马从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行. 题意很简单暴力dp的思路也很简单但是数据很恶心虽然远古一点,但毕竟是省选题 1 ≤ n ≤ 50,2 ≤ m ≤ 10^9 不过还是给了我们一点提示:n这么小? 总之我们先找出转移式对于每一个点

矩阵快速幂 优化dp 模板

相关博客 :https://blog.csdn.net/china_xyc/article/details/89819376#commentBox 关于能用矩阵乘法优化的DP题目,有如下几个要求: 转移式只有加法,清零,减法etc.,max和min运算不允许 转移式中关于前几位dp结果得到的系数必须是常量 转移次数一般超级多 由于转移次数多,一般都要模一个int范围内的数 综上,举一个例子: dp[i]=a×dp[i−1]+b×dp[i−2]+c×dp[i−3] 其中,a,b,c是常量,而在需要