zoukankan      html  css  js  c++  java
  • [51NOD1126]求递推序列的第n项(矩阵快速幂)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126

    存在参数a,b为负数的情况。这时候要这么处理:

    根据mod值(7)加至刚好大于0。

    否则有些样例是过不去的。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <fstream>
     8 #include <cassert>
     9 #include <cstdio>
    10 #include <bitset>
    11 #include <vector>
    12 #include <deque>
    13 #include <queue>
    14 #include <stack>
    15 #include <ctime>
    16 #include <set>
    17 #include <map>
    18 #include <cmath>
    19 
    20 using namespace std;
    21 
    22 const int maxn = 10;
    23 typedef struct Matrix {
    24     int m[maxn][maxn];
    25     int r;
    26     int c;
    27     Matrix(){
    28         r = c = 0;
    29         memset(m, 0, sizeof(m));
    30     } 
    31 } Matrix;
    32 
    33 Matrix mul(Matrix m1, Matrix m2, int mod) {
    34     Matrix ans = Matrix();
    35     ans.r = m1.r;
    36     ans.c = m2.c;
    37     for(int i = 1; i <= m1.r; i++) {
    38         for(int j = 1; j <= m2.r; j++) {
    39                for(int k = 1; k <= m2.c; k++) {
    40                 if(m2.m[j][k] == 0) continue;
    41                 ans.m[i][k] = ((ans.m[i][k] + m1.m[i][j] * m2.m[j][k] % mod) % mod) % mod;
    42             }
    43         }
    44     }
    45     return ans;
    46 }
    47 
    48 Matrix quickmul(Matrix m, int n, int mod) {
    49     Matrix ans = Matrix();
    50     for(int i = 1; i <= m.r; i++) {
    51         ans.m[i][i]  = 1;
    52     }
    53     ans.r = m.r;
    54     ans.c = m.c;
    55     while(n) {
    56         if(n & 1) {
    57             ans = mul(m, ans, mod);
    58         }
    59         m = mul(m, m, mod);
    60         n >>= 1;
    61     }
    62     return ans;
    63 }
    64 
    65 int a, b, n, m;
    66 
    67 int main() {
    68     // freopen("in", "r", stdin);
    69        m = 7;
    70     while(~scanf("%d %d %d", &a, &b, &n)) {
    71         Matrix p;
    72         while(a < 0) a += m;
    73         while(b < 0) b += m;
    74         p.r = 2, p.c = 1;
    75         p.m[1][1] = 1;
    76         p.m[2][1] = 1;
    77         if(n <= 4) {
    78             printf("%d
    ", p.m[4-n+1][1] % m);
    79             continue;
    80         }
    81         Matrix s;
    82         s.r = s.c = 2;
    83         s.m[1][1] = a, s.m[1][2] = b;
    84         s.m[2][1] = 1, s.m[2][2] = 0;
    85         s = quickmul(s, n-2, m);
    86         int ans = 0;
    87         for(int i = 1; i <= p.r; i++) {
    88             ans = (ans + (p.m[i][1] * s.m[1][i]) % m) % m;
    89         }
    90         printf("%d
    ", ans % m);
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/kirai/p/5473756.html
Copyright © 2011-2022 走看看