• hdu 1588【Gauss Fibonacci】


    表示这一题可以直接用4*4矩阵做,前提是看了解题报告来着。。。http://blog.csdn.net/lansetiankong_yiyi/article/details/5828239这个解题报告的第二种方法令我佩服,灵活应用了矩阵,关键是构造矩阵这一块我不太会

    我们来设置这样一个矩阵

     B I

     O I

     其中O是零矩阵,I是单位矩阵

      将它乘方,得到

     B^2 I+B

     O   I

     乘三方,得到

     B^3 I+B+B^2

     O   I  

    乘四方,得到

     B^4 I+B+B^2+B^3

     O   I  

    这个矩阵构造的令我佩服,记住了。。。

    然后这个矩阵的实现可以直接用4*4矩阵。。。

    然后呢,就是代码。。。

    代码如下:
      1 #include <cstdio>
      2 #include <cstring>
      3 
      4 typedef __int64 ll;
      5 const int size = 4;
      6 
      7 struct matrix
      8 {
      9     ll a[size][size];
     10 };
     11 
     12 ll K,b,n,mod;
     13 
     14 void zero_matrix(matrix &x)
     15 {
     16     memset(x.a,0,sizeof(x.a));
     17 }
     18 
     19 void one_matrix(matrix &x)
     20 {
     21     zero_matrix(x);
     22     for(int i = 0;i < size;i ++)
     23     {
     24         x.a[i][i] = 1;
     25     }
     26 }
     27 
     28 matrix mul_matrix(matrix &x,matrix &y)
     29 {
     30     matrix ans;
     31 
     32     for(int i = 0;i < size;i ++)
     33     {
     34         for(int j = 0;j < size;j ++)
     35         {
     36             ans.a[i][j] = 0;
     37             for(int k = 0;k < size;k ++)
     38             {
     39                 ans.a[i][j] += x.a[i][k] * y.a[k][j] % mod;
     40             }
     41             ans.a[i][j] %= mod;
     42         }
     43 
     44     }
     45 
     46     return ans;
     47 }
     48 
     49 matrix pow_matrix(matrix x,ll pow)
     50 {
     51     matrix ans;
     52 
     53     one_matrix(ans);
     54 
     55     for(;pow;pow >>= 1)
     56     {
     57         if(pow & 1)
     58         {
     59             ans = mul_matrix(ans,x);
     60         }
     61 
     62         x = mul_matrix(x,x);
     63     }
     64 
     65     return ans;
     66 }
     67 
     68 int main()
     69 {
     70     while(scanf("%I64d%I64d%I64d%I64d",&K,&b,&n,&mod) == 4)
     71     {
     72         matrix fib;
     73         zero_matrix(fib);
     74         fib.a[0][0] = 0;
     75         fib.a[0][1] = fib.a[1][1] = fib.a[1][0] = 1;
     76         matrix ans1 = pow_matrix(fib,b);
     77         matrix base = pow_matrix(fib,K);
     78 
     79         for(int i = 0;i < 4;i ++)
     80         {
     81             for(int j = 2;j < 4;j ++)
     82             {
     83                 base.a[i][j] = (i == j);
     84             }
     85         }
     86         base.a[0][2] = base.a[1][3] = 1;
     87         for(int i = 2;i < 4;i ++)
     88         {
     89             for(int j = 0;j < 2;j ++)
     90             {
     91                 base.a[i][j] = 0;
     92             }
     93         }
     94 
     95         matrix tmp = pow_matrix(base,n);
     96         matrix temp;
     97         zero_matrix(temp);
     98         for(int i = 0;i < 2;i ++)
     99         {
    100             for(int j = 0;j < 2;j ++)
    101             {
    102                 temp.a[i][j] = tmp.a[i][j+2];
    103             }
    104         }
    105         matrix ans = mul_matrix(ans1,temp);
    106         printf("%I64d\n",ans.a[1][0]);
    107     }
    108 
    109     return 0;
    110 }
  • 相关阅读:
    ftp
    字符串
    A函数跨区域
    树状结构
    easyUI的基础布局easyui-accordion
    easyUI的基础布局
    sql server 下载安装标记
    (办公)记事本_Linux常用的目录命令
    (办公)记事本_Linux目录
    (办公)记事本_购买域名
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2551486.html
Copyright © 2020-2023  润新知