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

    题目

    也是和LightOJ 1096 和LightOJ 1065 差不多的简单题目。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    int num,mod;
    struct matrix
    {
        int a[10][10];
    };
    
    matrix multiply(matrix x,matrix y)//矩阵乘法
    {
           matrix temp;
           for(int i=0;i<num;i++)
           {
                   for(int j=0;j<num;j++)
                   {
                           int ans=0;
                           for(int k=0;k<num;k++)
                           {
                                   ans+=((x.a[i][k]*y.a[k][j])%mod);
                           }
                           temp.a[i][j]=ans%mod;
                   }
           }
           return temp;
    }
    
    matrix calc(matrix origin ,matrix answ,int n)//矩阵快速幂——answ*origin^n
    {
         while(n)
         {
                 if(n%2==1)//原来比赛时一直是这里被我不小心改成了0,怪不得案例一直都过不了
                        answ=multiply(origin,answ);
                 origin=multiply(origin,origin);
                 n/=2;
         }
         return answ;
    }
    
    int main()
    {
        int n;
        while(scanf("%d%d",&n,&mod)!=EOF)
        {
            matrix origin= {0,1,0,0,0,0,0,0,0,0,
                            0,0,1,0,0,0,0,0,0,0,
                            0,0,0,1,0,0,0,0,0,0,
                            0,0,0,0,1,0,0,0,0,0,
                            0,0,0,0,0,1,0,0,0,0,
                            0,0,0,0,0,0,1,0,0,0,
                            0,0,0,0,0,0,0,1,0,0,
                            0,0,0,0,0,0,0,0,1,0,
                            0,0,0,0,0,0,0,0,0,1};
            matrix answ={0,0,0,0,0,0,0,0,0,0,
                         1,0,0,0,0,0,0,0,0,0,
                         2,0,0,0,0,0,0,0,0,0,
                         3,0,0,0,0,0,0,0,0,0,
                         4,0,0,0,0,0,0,0,0,0,
                         5,0,0,0,0,0,0,0,0,0,
                         6,0,0,0,0,0,0,0,0,0,
                         7,0,0,0,0,0,0,0,0,0,
                         8,0,0,0,0,0,0,0,0,0,
                         9,0,0,0,0,0,0,0,0,0};
            num=10;
            for(int i=9;i>=0;i--)//要注意这里的a9~a0的输入顺序
                scanf("%d",&origin.a[9][i]);
    
            answ=calc(origin,answ,n-9);
            printf("%d
    ",answ.a[9][0]%mod);
        }
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    【SQL】SQL Server登录常见问题
    【毒思】纪念我死去的爱情
    【毒思】化蝶双飞
    VS2013常用快捷键你敢不会?
    SSIS 更新变量
    一次SSIS Package的调试经历
    binary 和 varbinary 用法全解
    Execute SQL Task 第二篇:返回结果集
    OLEDB 命令转换组件的用法
    脚本组件的用法
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3558471.html
Copyright © 2011-2022 走看看