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;
        }
    }


  • 相关阅读:
    [TJOI2013]单词 AC 自动机
    NOIP 2017 逛公园 记忆化搜索 最短路 好题
    [BJWC2012]冻结 分层图最短路
    dijkstra STL 堆优化
    [POI2002][HAOI2007]反素数 数论 搜索 好题
    bzoj 2456: mode 思维题 好题
    [SDOI2012]Longge的问题 欧拉反演_欧拉函数
    [JLOI2011]飞行路线 分层图最短路
    页面加速优化
    制作html5微信页面的经验总结。
  • 原文地址:https://www.cnblogs.com/riskyer/p/3317845.html
Copyright © 2011-2022 走看看