zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    autorun.inf删除方法
    Re_Write序列号
    最常用的正则表达式
    SQL聚合使用GROUP BY
    Ext.Net的Window控件的简单使用
    SQL统计查询一个表中的记录,然后减法运算
    C#金额转换为汉字大写
    Ext.Net的Button按钮的使用
    C# 参考之方法参数关键字:params、ref及out 引用
    C#连接ACCESS 2007数据库
  • 原文地址:https://www.cnblogs.com/changer-qyz/p/8442839.html
Copyright © 2011-2022 走看看