zoukankan      html  css  js  c++  java
  • Hdoj 1575

    原题链接

    描述

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

    输入

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

    输出

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

    样例输入

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

    样例输出

    2
    2686

    思路

    矩阵快速幂取模。
    算出最后矩阵后求迹,也就是主对角线元素之和。

    代码

    #include <cstdio>
    #define ll long long
    #define maxn 10
    using namespace std;
    
    struct mat
    {
    	ll f[maxn+2][maxn+2];
    	mat()
    	{
    		for(int i = 0; i < maxn+2; i++)
    			for(int j = 0; j < maxn+2; j++)
    				f[i][j] = 0;
    	}
    };
    
    mat mulmod(mat a, mat b, ll c, ll l)
    {
    	mat d;
    	for(int i = 0; i < l; i++)
    		for(int j = 0; j < l; j++)
    		{
    			for(int k = 0; k < l; k++)
    				d.f[i][j] += a.f[i][k] * b.f[k][j];
    			d.f[i][j] %= c;
    		}
    	return d;
    }
    
    mat qow(mat a, ll b, ll c, ll d)  
    {  
        mat ans;
        for(int i = 0; i < d; i++) ans.f[i][i] = 1;
        while(b != 0)  
        {
            if(b & 1) ans = mulmod(ans, a, c, d) ;
            b >>= 1;
            a = mulmod(a, a, c, d);
        }
        return ans;  
    }
    
    int main()
    {
    	int n; scanf("%d", &n);
    	while(n--)
    	{
    		mat a;
    		ll l, k; scanf("%lld %lld", &l, &k);
    		for(int i = 0; i < l; i++)
    			for(int j = 0; j < l; j++)
    				scanf("%lld", &a.f[i][j]);
    		a = qow(a, k, 9973, l);
    		ll sum = 0;
    		for(int i = 0; i < l; i++)
    			sum += a.f[i][i];
    		sum %= 9973;
    		printf("%lld
    ", sum);
    	}
    	return 0;
    }
    
  • 相关阅读:
    如何优雅地使用 Stack Overflow
    Quartz总结
    slf4j-api、slf4j-log4j12以及log4j之间什么关系?
    eclipse 安装 spring boot suite 插件遇到的问题
    Java项目结构总结
    netstat 与 telnet
    微服务架构中的安全认证与鉴权
    git 常用命令
    session 、cookie、token的区别
    List和Set区别
  • 原文地址:https://www.cnblogs.com/HackHarry/p/8390888.html
Copyright © 2011-2022 走看看