• HDU 2604 Queuing


    Queuing

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4638    Accepted Submission(s): 2045


    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
     
    Author
    WhereIsHeroFrom
    Source
     
    Recommend
    lcy
     
    对于长度为n的队列q(n),做以下讨论。
    图中 ,".....m"表示以字符'm'结尾的queue,其它类似。E_q表示E_queue。
     
    定义f(n)为队列q(n)之中满足E_queue的队列个数。
    可得f(n)=f(n-1)+f(n-3)+f(n-4)
    转换为矩阵,运用矩阵快速幂运算进行求解。
    即,
    n>=4,
     
     
     
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <map>
     4 #include <vector>
     5 #include <functional>
     6 #include <string>
     7 #include <cstring>
     8 #include <queue>
     9 #include <set>
    10 #include <cmath>
    11 #include <cstdio>
    12 using namespace std;
    13 #define IOS ios_base::sync_with_stdio(false)]
    14 typedef long long LL;
    15 const int INF=0x3f3f3f3f;
    16 
    17 const int maxn=6;
    18 int modnum;
    19 typedef struct matrix{
    20     int v[maxn][maxn];
    21     void init(){memset(v,0,sizeof(v));}
    22 }M;
    23 M mul_mod(const M &a,const M &b,int L,int m,int n)
    24 {
    25     M c; c.init();
    26     for(int i=0;i<L;i++){
    27         for(int j=0;j<n;j++){
    28             for(int k=0;k<m;k++)//注意j,k范围
    29                 c.v[i][j]+=a.v[i][k]*b.v[k][j]%modnum;
    30             c.v[i][j]%=modnum;
    31         }
    32     }
    33     return c;
    34 }
    35 M power(M x,int L,int p)
    36 {
    37     M tmp; tmp.init();
    38     for(int i=0;i<L;i++)
    39         tmp.v[i][i]=1;
    40     while(p){
    41         if(p&1) tmp=mul_mod(x,tmp,L,L,L);
    42         x=mul_mod(x,x,L,L,L);
    43         p>>=1;
    44     }
    45     return tmp;
    46 }
    47 int main()
    48 {
    49     int L;
    50     M a,b;
    51     while(scanf("%d%d",&L,&modnum)!=EOF){
    52         b.init();
    53         b.v[0][0]=9%modnum;
    54         b.v[1][0]=6;
    55         b.v[2][0]=4;
    56         b.v[3][0]=2;
    57         if(L==0){printf("1
    "); continue;}
    58         if(L<5){printf("%d
    ",b.v[4-L][0]); continue;}
    59         a.init();
    60         a.v[0][0]=a.v[0][2]=a.v[0][3]=a.v[1][0]=a.v[2][1]=a.v[3][2]=1;
    61         a=power(a,4,L-4);
    62         a=mul_mod(a,b,4,4,1);
    63         printf("%d
    ",a.v[0][0]);
    64     }
    65 }
    View Code

    网上有介绍用trie图得到递推式的方法,根节点为字符串的最后一个字符,根据前一个字符进行状态转移。

    不是非常理解,暂且记录下来。

     
     
  • 相关阅读:
    【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十六:VGA模块
    mini2440 u-boot下设置tftp
    mini2440 u-boot禁止蜂鸣器
    【转载】帧缓冲驱动程序分析及其在BSP上的添加
    debian7 amd64版本添加对x86包的支持
    debian7配置
    u盘安装debian 7(Wheezy) stabe
    【python练习题】实现字符串反转
    【python练习题】 删除列表中的重复元素(list的应用)
    【python练习题】冒泡排序 和插入排序 (list的应用)
  • 原文地址:https://www.cnblogs.com/cumulonimbus/p/5692903.html
Copyright © 2020-2023  润新知