• hdoj1757 A Simple Math Problem(矩阵快速幂)


    构造矩阵。

    1,当k<=9时,直接输出;

    2,当k >9时,先求原矩阵的(k-9)次幂res矩阵,在求幂的过程中对m取余。最后res矩阵再与矩阵F相乘得到矩阵ans,相乘的过程中对m取余。ans矩阵的第一个元素就是答案。

    PS.orz,这道题一气呵成。只不过我好像和大家构造矩阵的方向有点点差别。这不重要!能做出题就妥!

     1 #include<iostream>
     2 #include<cstring>
     3 #define maxn 12
     4 using namespace std;
     5 int f[10]={0,1,2,3,4,5,6,7,8,9};
     6 struct mat{
     7     int a[maxn][maxn];
     8 };
     9 mat mat_mul(mat x,mat y,int Mod){
    10     mat ans;
    11     memset(ans.a,0,sizeof(ans.a));
    12     for (int i=0;i<10;i++)
    13         for (int j=0;j<10;j++)
    14         for (int k=0;k<10;k++){
    15             ans.a[i][j]+=x.a[i][k]*y.a[k][j];
    16             ans.a[i][j]%=Mod;
    17         }
    18     return ans;
    19 }
    20 void mat_pow(mat &res,int k,int Mod){
    21     mat c=res;
    22     k--;
    23     while (k){
    24         if (k&1) res=mat_mul(res,c,Mod);
    25         k>>=1;
    26         c=mat_mul(c,c,Mod);
    27     }
    28 }
    29 int main(){
    30     mat res;
    31     int k,m;
    32     while (cin >> k >> m){
    33         memset(res.a,0,sizeof(res.a));
    34         for (int i=0;i<10;i++){
    35             cin >> res.a[i][0];
    36             res.a[i][i+1]=1;
    37         }
    38         if (k<=9){
    39             cout <<  f[k]%m << endl;
    40             continue;
    41         }
    42         else mat_pow(res,k-9,m);
    43         int ans=0;
    44         for (int i=0;i<10;i++){
    45             ans+=res.a[i][0]*f[9-i]%m;
    46         }
    47         cout << ans%m << endl;
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    [BUUOJ记录] [强网杯 2019]随便注(三种方法)
    Content Security Policy (CSP)内容安全策略总结
    [HGAME Week2] Cosmos的博客后台
    [BUUOJ记录] [ACTF2020 新生赛]Include
    PHP弱类型hash比较缺陷
    CTF常见源码泄漏总结
    Sqlmap Tamper绕过脚本详解
    Golden Pyramid
    Prime Palindrome Golf
    Min and Max
  • 原文地址:https://www.cnblogs.com/changer-qyz/p/8442839.html
Copyright © 2020-2023  润新知