zoukankan      html  css  js  c++  java
  • hdu 1757 A Simple Math Problem

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

      如题,简单的矩阵快速幂。1y!

    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cassert>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 
     8 const int maxSize = 10;
     9 const int initMod = 1E9 + 7;
    10 int curSize = maxSize;
    11 int curMod = initMod;
    12 
    13 struct Matrix {
    14     int val[maxSize][maxSize];
    15 
    16     Matrix(bool ONE = false) {
    17         for (int i = 0; i < curSize; i++) {
    18             for (int j = 0; j < curSize; j++) {
    19                 val[i][j] = 0;
    20             }
    21             if (ONE) val[i][i] = 1;
    22         }
    23     }
    24 
    25     void print(int _l = curSize, int _w = curSize) {
    26         for (int i = 0; i < _l; i++) {
    27             for (int j = 0; j < _w; j++) {
    28                 if (j) putchar(' ');
    29                 printf("%d", val[i][j]);
    30             }
    31             puts("");
    32         }
    33         puts("~~");
    34     }
    35 };
    36 
    37 Matrix operator * (Matrix &_a, Matrix &_b) {
    38     Matrix ret = Matrix();
    39 
    40     for (int i = 0; i < curSize; i++) {
    41         for (int k = 0; k < curSize; k++) {
    42             if (_a.val[i][k]) {
    43                 for (int j = 0; j < curSize; j++) {
    44                     ret.val[i][j] += _a.val[i][k] * _b.val[k][j];
    45                     ret.val[i][j] %= curMod;
    46                 }
    47             }
    48         }
    49     }
    50 
    51     return ret;
    52 }
    53 
    54 Matrix operator ^ (Matrix &_a, int _p) {
    55     Matrix __a = _a, ret = Matrix(true);
    56 
    57     while (_p) {
    58         if (_p & 1) {
    59             ret = ret * __a;
    60         }
    61         __a = __a * __a;
    62         _p >>= 1;
    63     }
    64 
    65     return ret;
    66 }
    67 
    68 int deal(int k) {
    69     if (k < 10) return k % curMod;
    70 
    71     Matrix ans = Matrix(), op = Matrix();
    72 
    73     for (int i = 0; i < 10; i++) {
    74         ans.val[0][i] = 9 - i;
    75     }
    76 //    ans.print();
    77     for (int i = 0; i < 10; i++) {
    78         scanf("%d", &op.val[i][0]);
    79     }
    80     for (int i = 1; i < 10; i++) {
    81         op.val[i - 1][i] = 1;
    82     }
    83 //    op.print();
    84     op = op ^ (k - 9);
    85     ans = ans * op;
    86 //    ans.print();
    87 
    88     return ans.val[0][0];
    89 }
    90 
    91 int main() {
    92     int n;
    93 
    94     while (~scanf("%d%d", &n, &curMod)) {
    95         printf("%d\n", deal(n));
    96     }
    97 
    98     return 0;
    99 }

    ——written by Lyon

  • 相关阅读:
    Oracle数据库相关问题
    常用Oracle数据库查询SQL
    VS2019添加引用错误:COM组件调用返回错误HRESULT E_FAIL
    C#.NET重点知识点汇总(三)
    C#.NET重点知识点汇总(二)
    C#.NET重点知识点汇总(一)
    ajax的19道经典面试题
    C#设计模式——抽象工厂模式
    C#设计模式——工厂方法模式
    C#设计模式——简单工厂模式
  • 原文地址:https://www.cnblogs.com/LyonLys/p/hdu_1757_Lyon.html
Copyright © 2011-2022 走看看