zoukankan      html  css  js  c++  java
  • hdu2604 Queuing

    Queuing

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


    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

    可以看成只有0 1 串的字符串,长度为n的字符串中子串中不出现101 和111这两个的总数量有多少。然后求模m

    恨容易推出an = an-1+an-3+an-4,然后m是一个不变的话,就可以直接循环遍历了。但m是个变量。

    由于an = an-1+an-3+an-4 ,所以可以得到:

    an      1    0   1  1    an-1

    an-1      1    0   0    0    an-2

    an-2     =       0    1   0    0     *        an-3

    an-3         0    0   1  0      an-4

    得到公式就好写了。

     1 // a[n] = a[n-1]+a[n-3]+a[n-4];
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 int n, m;
     5 struct mat{
     6     int m[4][4];
     7     mat() {
     8         memset(m, 0, sizeof(m));
     9     }
    10 };
    11 mat mul(mat &A, mat &B) {
    12     mat C;
    13     for(int i = 0; i < 4; i ++) {
    14         for(int j = 0; j < 4; j ++) {
    15             for(int k = 0; k < 4; k ++) {
    16                 C.m[i][j] = (C.m[i][j] + A.m[i][k]*B.m[k][j]) % m;
    17             }
    18         }
    19     }
    20     return C;
    21 }
    22 mat pow(mat A, int n){
    23     mat B;
    24     for(int i = 0; i < 4; i ++) B.m[i][i] = 1;
    25     while(n) {
    26         if(n&1) B = mul(B,A);
    27         A = mul(A,A);
    28         n >>= 1;
    29     }
    30     return B;
    31 }
    32 int main() {
    33     while(cin >> n >> m) {
    34         mat A;
    35         if(n==0) printf("%d
    ",1%m);
    36         else if(n==1) printf("%d
    ",2%m);
    37         else if(n==2) printf("%d
    ",4%m);
    38         else if(n==3) printf("%d
    ",6%m);
    39         else {
    40             A.m[0][0] = A.m[0][2] = A.m[0][3] = 1;
    41             A.m[1][0] = A.m[2][1] = A.m[3][2] = 1;
    42             A = pow(A,n-3);
    43             int ans = A.m[0][0]*6+A.m[0][1]*4+A.m[0][2]*2+A.m[0][3];
    44             printf("%d
    ",ans%m);
    45         }
    46     }
    47     return 0;
    48 }
  • 相关阅读:
    Eclipse快速上手指南之使用CVS
    数据备份的13种最佳做法
    用asp.net来回收IIS6.0应用程序池
    构建插件式的应用程序框架(五)-管理插件
    安全组织评出25个最危险软件编程错误
    在ASP.NET里轻松实现缩略图
    构建插件式的应用程序框架(六)-通讯机制
    快照复制,SQL Server保障数据一致性的法宝
    DataGridView新特色、常用操作
    如何在GridView中一次性批量更新多行数据
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8999876.html
Copyright © 2011-2022 走看看