zoukankan      html  css  js  c++  java
  • 蓝桥杯:递推求值(构造矩阵+矩阵快速幂)

    http://lx.lanqiao.cn/problem.page?gpid=T396

    题意:……

    思路:自始至终不会构造矩阵,yr大佬手把手教我构造矩阵Orz。

    先把有用的信息写成一个矩阵F,然后判断下一步要推出来的信息是怎么构成的,然后一行一行构造矩阵A。

    最后将构造得到的矩阵A乘n次,再乘F,就可以得到答案了。

    矩阵A的第一行就是F中的哪些信息可以构成F1(n),就选择性用上,以此类推可以构造出来。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define MOD 99999999
     4 typedef long long LL;
     5 
     6 struct Matrix {
     7     LL mat[10][10]; int r, c;
     8     Matrix () { memset(mat, 0, sizeof(mat)); }
     9     Matrix (int a, int b) { r = a; c = b; memset(mat, 0, sizeof(mat)); }
    10     void init() { memset(mat, 0, sizeof(mat)); }
    11     void E() { memset(mat, 0, sizeof(mat)); for(int i = 1; i <= 9; i++) mat[i][i] = 1; }
    12 };
    13 
    14 Matrix operator * (Matrix a, Matrix b) {
    15     Matrix c = Matrix(a.r, b.c);
    16     for(int i = 1; i <= a.r; i++) {
    17         for(int k = 1; k <= a.c; k++) {
    18             for(int j = 1; j <= b.c; j++) {
    19                 c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j] % MOD) % MOD;
    20             }
    21         }
    22     }
    23     return c;
    24 }
    25 
    26 Matrix operator ^ (Matrix a, LL k) {
    27     Matrix p = Matrix(7, 7), tmp = a;
    28     p.E();
    29     while(k) {
    30         if(k & 1) p = p * tmp;
    31         tmp = tmp * tmp;
    32         k >>= 1;
    33     }
    34     return p;
    35 }
    36 
    37 void print(Matrix now) {
    38     for(int i = 1; i <= now.r; i++) {
    39         for(int j = 1; j <= now.c; j++) {
    40             printf("%lld ", now.mat[i][j]);
    41         }
    42         puts("");
    43     }
    44 }
    45 
    46 int main() {
    47     Matrix now = Matrix(7, 7);
    48     now.mat[1][2] = 1; now.mat[1][5] = 2; now.mat[1][7] = 5;
    49     now.mat[2][1] = 1; now.mat[2][5] = 3; now.mat[2][6] = 2; now.mat[2][7] = 3;
    50     now.mat[3][1] = 1;
    51     now.mat[4][2] = 1;
    52     now.mat[5][3] = 1;
    53     now.mat[6][4] = 1;
    54     now.mat[7][7] = 1;
    55     Matrix f = Matrix(7, 1);
    56     f.mat[1][1] = 6; f.mat[2][1] = 5; f.mat[3][1] = 1;
    57     f.mat[4][1] = 4; f.mat[5][1] = 2; f.mat[6][1] = 3; f.mat[7][1] = 1;
    58 
    59     LL n; cin >> n;
    60     if(n == 2) { printf("1
    4
    "); return 0; }
    61     else if(n == 1) { printf("2
    3
    "); return 0; }
    62     n -= 3;
    63     Matrix ans = now ^ n;
    64     ans = ans * f;
    65     cout << ans.mat[1][1] << endl << ans.mat[2][1] << endl;
    66     return 0;
    67 }
  • 相关阅读:
    android 多线程
    Uva 10881 Piotr’s Ants 蚂蚁
    LA 3708 Graveyard 墓地雕塑 NEERC 2006
    UVa 11300 Spreading the Wealth 分金币
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    HDU 4162 Shape Number
    HDU 1869 六度分离
    HDU 1041 Computer Transformation
    利用可变参数函数清空多个数组
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6671936.html
Copyright © 2011-2022 走看看