zoukankan      html  css  js  c++  java
  • HDU 1757 A Simple Math Problem(矩阵快速幂)

    题目链接

    题意 :给你m和k, 让你求f(k)%m。如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… + a9 * f(k-10);
    思路 :先具体介绍一下矩阵快速幂吧,刚好刚刚整理了网上的资料。可以先了解一下这个是干嘛的,怎么用。

    这个怎么弄出来的我就不说了,直接看链接吧,这实在不是我强项,点这儿这儿也行

     1 //HDU 1757
     2 #include <iostream>
     3 #include <stdio.h>
     4 
     5 using namespace std;
     6 
     7 struct matrix
     8 {
     9     int m[10][10] ;
    10 } b,tp,res,init ;
    11 
    12 int n,m ;
    13 
    14 matrix Mul(matrix a,matrix b)
    15 {
    16     matrix c ;
    17     for(int i = 0 ; i < 10 ; i++)
    18     {
    19         for(int j = 0 ; j < 10 ; j++)
    20         {
    21             c.m[i][j] = 0 ;
    22             for(int k = 0 ; k < 10 ; k++)
    23             {
    24                 c.m[i][j] += (a.m[i][k] * b.m[k][j]) % m ;
    25                 c.m[i][j] %= m ;
    26             }
    27         }
    28     }
    29     return c ;
    30 }
    31 
    32 matrix matrix_mi(matrix p,int k)
    33 {
    34     matrix t = res;
    35     for(int i = 0 ; i <= 10 ; i++) t.m[i][i] = 1 ;
    36     while(k)
    37     {
    38         if(k & 1)
    39             t = Mul(t,p) ;
    40         k >>= 1 ;
    41         p = Mul(p,p) ;
    42     }
    43     return t ;
    44 }
    45 
    46 void Init()
    47 {
    48     for(int i = 0 ; i < 10 ; i++)
    49         for(int j = 0 ; j < 10 ; j++)
    50             if(i-1 == j)
    51                 init.m[i][j]=1;
    52             else
    53                 init.m[i][j]=0;
    54 }
    55 int main()
    56 {
    57     Init() ;
    58     while(~scanf("%d %d",&n,&m))
    59     {
    60         b = init ;
    61         for(int i = 0 ; i < 10 ; i++)
    62             scanf("%d",&b.m[0][i]) ;
    63         for(int i = 0 ; i < 10 ; i++)
    64             for(int j = 0 ; j < 10 ; j++)
    65                 if(i==j)
    66                     res.m[i][j] = 1 ;
    67                 else
    68                     res.m[i][j] = 0 ;
    69         if(n >= 10)
    70         {
    71             int sum = 0 ;
    72             tp = matrix_mi(b,n-9) ;
    73             for(int i = 0 ; i < 10 ; i++)
    74                 sum += (tp.m[0][i] * (9-i))%m ;
    75             printf("%d
    ",sum%m) ;
    76         }
    77         else printf("%d
    ",n%m) ;
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    loads和dumps的用法
    python实现装饰器
    pycharm 配置 git 方法
    正则表达式——练习一
    fiddler下载安装
    robotframework引入seleniumlibrary报错
    Codeforces-936B Sleepy Game
    Codeforces-940D. Alena And The Heater
    Codeforces-935D. Fafa and Ancient Alphabet
    Java编程规范
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3674431.html
Copyright © 2011-2022 走看看