zoukankan      html  css  js  c++  java
  • poj3070

    矩阵第一题。也是矩阵的模板题。下面是模板。

    比较重要的是,矩阵的乘法会有很多很神奇的用法。比如如下几个网站所讲。

    http://www.matrix67.com/blog/archives/276   这是Matrix67大神的网站。

    http://wenku.baidu.com/view/cec297c7bb4cf7ec4afed0f1.html?qq-pf-to=pcqq.c2c

    http://wenku.baidu.com/view/42f0080c4a7302768e99390d.html?qq-pf-to=pcqq.c2c

    #include <iostream>

    using namespace std;

    #define MAXN 2
    #define LL long long
    #define mod 10000

    class Matrix
    {
    public:

        long long m[MAXN][MAXN];
        //二维数组存放矩阵 
        Matrix(){}
        //对数组的初始化 
        void init(long long  num[MAXN][MAXN]){
            for (int i = 0; i < MAXN; i++){
                for (int j = 0; j < MAXN; j++){
                    m[i][j] = num[i][j];
                }
            }
        }
        //重载矩阵的乘法运算 

        friend Matrix operator*(Matrix &m1, Matrix &m2) {
            int i, j, k;
            Matrix temp;
            for (i = 0; i < MAXN; i++) {
                for (j = 0; j < MAXN; j++) {
                    temp.m[i][j] = 0;
                    for (k = 0; k < MAXN; k++)
                        temp.m[i][j] += (m1.m[i][k] * m2.m[k][j])%mod;
                    temp.m[i][j] %= mod;
                    //注意每一步都进行取模 
                }
            }
            return temp;
        }
        //矩阵的快速幂 

        friend Matrix quickpow(Matrix &M, long long n){
            Matrix tempans;
            //初始化为单位矩阵 
            //初始化 
            for (int i = 0; i < MAXN; i++){
                for (int j = 0; j < MAXN; j++){
                    if (i == j)
                        tempans.m[i][j] = 1;
                    else
                        tempans.m[i][j] = 0;
                }
            }
            //快速幂(类似整数) 
            while (n)
            {
                if (n & 1)
                    tempans = tempans * M;
                //已经重载了* 
                n = n >> 1;
                M = M * M;
            }
            return tempans;
        }
    };

    int main()
    {

        LL n;
        while (cin >> n &&n != -1)
        {
            Matrix M;
            LL mm[MAXN][MAXN] = { 1110 };
            M.init(mm);
            Matrix temp = quickpow(M, n);
            cout << temp.m[1][0] << endl;
        }
    }


  • 相关阅读:
    【字符编码】Java编码格式探秘
    【集合框架】JDK1.8源码分析之Collections && Arrays(十)
    【面试】shuffle函数的实现
    关于Jquery中ajax方法data参数用法的总结
    关于BootStrap下图标的显示问题
    dajngo权限管理
    Django下TemplateDoesNotExist 异常的解决方法:
    ubuntu安装有道
    python manage.py shell之后的一些错误:
    fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
  • 原文地址:https://www.cnblogs.com/riskyer/p/3317845.html
Copyright © 2011-2022 走看看