zoukankan      html  css  js  c++  java
  • hdu 2604 Queuing (矩阵乘法 求递推式)

    http://acm.hdu.edu.cn/showproblem.php?pid=2604

    题意:

    有 l 个人  排成一队,这l 个人可以 f(女人),也可能是 m(男人),求 这些人中 不含有 fmf  和 fff 这样的子序列的 个数.

     结果  % mod

    输入 l, mod;

    题解:

    由于L 比较大 ,我们可以求出 递推式后 用矩阵 乘法 求结果。

    接下来我们要考虑递推到n时新生成的E-queues,显然只考虑n-1时E-queues的最后两位的情况即可

    我们用 an 表示 以 开头为 fm 的数量 ,bn 表示 开头为 ff的数量 ,cn 表示 开头为 mf 的数量 dn 表示 开头为 mm 的数量。

    an = d(n-1);

    bn = a(n - 1);

    cn = a(n - 1) + b(n - 1);

    dn = c(n - 1) + d(n - 1);

    最后 求 an+bn+cn+dn 即可

     an        0 0 0 1           a(n -1)

    bn   =   1 0 0 0      *   b(n - 1)

    cn        1 0 1 0           c(n - 1)

    dn        0 0 1 1          d(n - 1)

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cmath>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<set>
      7 #include<map>
      8 #include<queue>
      9 #include<vector>
     10 #include<string>
     11 #define Min(a,b) a<b?a:b
     12 #define Max(a,b) a>b?a:b
     13 #define CL(a,num) memset(a,num,sizeof(a));
     14 #define eps  1e-12
     15 #define inf 100000000
     16 #define mx 1<<60
     17 #define ll   __int64
     18 const double pi  = acos(-1.0);
     19 const int maxn = 200;
     20 using namespace std;
     21 struct matrix
     22 {
     23     int m[4][4];
     24 }p,b,e;
     25 int mod;
     26 void init()
     27 {
     28     CL(p.m,0);
     29     p.m[0][3] = 1;
     30     p.m[1][0] = 1;
     31     p.m[2][0] = 1;
     32     p.m[2][1] = 1;
     33     p.m[3][2] = 1;
     34     p.m[3][3] = 1;
     35 
     36     CL(b.m,0);
     37     b.m[0][0] = 1;
     38     b.m[1][0] = 1;
     39     b.m[2][0] = 1;
     40     b.m[3][0] = 1;
     41 
     42     for(int i = 0 ; i < 4;i++)
     43     {
     44         e.m[i][i] = 1;
     45     }
     46 
     47 }
     48 matrix mtmul(matrix a,matrix b)
     49  {
     50      int i,j,k;
     51      matrix c;
     52      CL(c.m,0);
     53      for(i =0 ; i < 4;i++)
     54      {
     55          for(k = 0; k < 4;k++)
     56          {
     57 
     58                  if(a.m[i][k])
     59              for(j = 0 ; j < 4;j++)
     60              {
     61                  c.m[i][j] += a.m[i][k]*b.m[k][j];
     62                  c.m[i][j]%=mod;
     63 
     64              }
     65          }
     66      }
     67      return c;
     68  }
     69  matrix mtpow(matrix d,int k)
     70 {
     71     matrix a;
     72     if(k == 1return d;
     73     int mid = k / 2;
     74     a = mtpow(d,k/2);
     75     a = mtmul(a,a);
     76     if(k & 1)
     77     {
     78         a = mtmul(a,d);
     79     }
     80     return a;
     81 
     82 
     83 }
     84 int main()
     85 {
     86     int len,i;
     87 
     88     while(scanf("%d%d",&len,&mod)!=EOF)
     89     {
     90 
     91          init() ;
     92         if(len == 1)
     93         {
     94             printf("%d\n",2 % mod);
     95 
     96             continue ;
     97         }
     98         if(len == 2)
     99         {
    100             printf("%d\n",4 % mod);
    101             continue ;
    102         }
    103 
    104 
    105         matrix d ;
    106        d = mtpow(p,len - 2);
    107 
    108 
    109         d = mtmul(d,b);
    110         int ans = 0;
    111         for(i = 0 ; i < 4;i++)
    112         {
    113             ans += d.m[i][0];
    114             ans %= mod;
    115         }
    116         printf("%d\n",ans);
    117     }
    118 }

  • 相关阅读:
    SqlServer 格式化时间
    工作生活两三事
    前端面试题准备 3
    前端面试题准备 2
    MYSQL---自定义函数
    MYSQL---MD5()、PASSWORD()函数
    MYSQL---DATE_ADD()
    MYSQL---%
    MYSQL---多表删除
    MYSQL---CREATE...SELECT
  • 原文地址:https://www.cnblogs.com/acSzz/p/2664526.html
Copyright © 2011-2022 走看看