zoukankan      html  css  js  c++  java
  • hdu 1575 矩阵快速幂模板题

    Tr A

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 5008    Accepted Submission(s): 3738


    Problem Description
    A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
     

    Input
    数据的第一行是一个T,表示有T组数据。
    每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
     

    Output
    对应每组数据,输出Tr(A^k)%9973。
     

    Sample Input
    2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
     

    Sample Output
    2 2686
     

    Author
    xhd
     

    Source

    矩阵快速幂基础题吧

    矩阵快速幂原理:http://www.cnblogs.com/yan-boy/archive/2012/11/29/2795294.html  二进制离散化思想,这里的除2其实就是>>2

    要注意每次运算都要取模,避免高精度运算

    这里的结构体运算符重载和构造初始化还要看下

    把mat()构造初始化函数写在结构体里面,每次定义结构体变量,都会调用这个构造初始化函数,是真的很方便诶?

    #include <bits/stdc++.h>
    using namespace std;
    
    
    typedef long long ll;
    const int maxn = 12;
    const int mod = 9973;
    struct mat {
        int s[maxn][maxn];
        mat(){ //初始化!要注意乘法这里的重载界限是maxn的,
               //可能会在多组数据因为没有初始化曹成错误,但是n给出来了,加的都是n范围之内的,所以这个题结果没有影响
            memset(s,0,sizeof(s));
        };
        mat operator * (const mat& c) {
        mat ans;
        for (int i = 0; i < maxn; i++) //矩阵乘法
            for (int j = 0; j < maxn; j++)
                for (int k = 0; k < maxn; k++)
                    ans.s[i][j] = (ans.s[i][j] + s[i][k] * c.s[k][j]) % mod;
        return ans;
        }
    }str;
    
    
    mat pow_mod(ll k) {
        if (k == 1)
            return str;
        mat a = pow_mod(k/2);//不能改
        mat ans = a * a;
        if (k & 1)
            ans = ans * str;
        return ans;
    }
    
    
    
    
    int main() {
    //    freopen("in.txt","r",stdin);
        int T,n,k;
        cin>>T;
        while(T--) {
            cin>>n>>k;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    scanf("%d", &str.s[i][j]);
        mat sub = pow_mod(k);
        ll ans = 0;
        for(int i = 0; i < n; i++) {
            ans += sub.s[i][i];
            ans %= mod;
        }
        cout<<ans<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    php socket 客户端代码
    linux crontab定时执行
    加载 pcntl 多进程
    Xdebug 配置
    Zend Debugger 配置
    windows SVN搭建
    深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
    操作系统-分段机制
    C++中的new、operator new与placement new
    线程安全的概念
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256617.html
Copyright © 2011-2022 走看看