• 二元数列


    题目地址:http://www.51cpc.com/web/problem.php?id=4267

    Knowledge Point:https://www.cnblogs.com/liubilan/p/9450568.html

    Summarize:

      1. 矩阵乘法 a*b 与 b*a 不同,注意顺序;

      2. 初始其中一个是乘数应该为对角矩阵,且对角线上元素全部为1,作用类似于整数1;

      3. 关于函数返回值,由于试了很久我也没能直接返回二维数组,所以在这里用结构体封装二维数组,函数返回结构体;

    附代码:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 #define LL long long
     6 #define MOD 20181225
     7 LL x0, y0, a, b, c, d, n;
     8 struct Matrix {
     9     LL w[2][2];
    10 }matrix;
    11 
    12 Matrix calculate(Matrix x, Matrix y)
    13 {    
    14     Matrix tmp;
    15     memset(tmp.w, 0, sizeof(tmp.w));
    16     for(int i=0; i<2; i++)
    17         for(int j=0; j<2; j++) {
    18             for(int k=0; k<2; k++)
    19                 tmp.w[i][j] += x.w[i][k]*y.w[k][j];
    20             tmp.w[i][j]%=MOD;
    21         }
    22     return tmp;
    23 }
    24 
    25 void Quick_Pow()
    26 {
    27     Matrix tmp;
    28     tmp.w[0][0]=tmp.w[1][1]=1;
    29     tmp.w[0][1]=tmp.w[1][0]=0;
    30     
    31     while(n) {
    32         if(n&1) {
    33             tmp = calculate(matrix, tmp);
    34         }
    35         matrix = calculate(matrix, matrix);
    36         n>>=1;
    37     }
    38     
    39     LL xn = (tmp.w[0][0]*x0%MOD + tmp.w[0][1]*y0%MOD)%MOD;
    40     LL yn = (tmp.w[1][0]*x0%MOD + tmp.w[1][1]*y0%MOD)%MOD;
    41     cout<<xn<<' '<<yn<<endl;
    42 }
    43 
    44 int main()
    45 {
    46     ios::sync_with_stdio(false);
    47     while(cin>>x0>>y0>>a>>b>>c>>d>>n) {
    48         matrix.w[0][0]=a, matrix.w[0][1]=b;
    49         matrix.w[1][0]=c, matrix.w[1][1]=d;
    50         Quick_Pow();
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    Golang学习
    Golang学习
    基础知识
    Golang学习
    基础知识
    hyper-v server 2016安装,客户端远程管理
    inotifywait命令
    CENTOS 7发送邮件测试
    NFS学习
    awk命令
  • 原文地址:https://www.cnblogs.com/liubilan/p/9450704.html
Copyright © 2020-2023  润新知