• Tr A(矩阵快速幂)


    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

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    #include<vector>
    #include<cmath>
    
    
    const int maxn =1e5+5;
    const int mod =9973;
    typedef long long ll;
    using namespace std;
    struct mat
    {
    	int a[15][15];
    };
    int n;
    mat Mul(mat a,mat b)
    {
    	mat ans;
    	memset(ans.a,0,sizeof(ans.a));
    	for(int t=0;t<n;t++)
    	{
    		for(int j=0;j<n;j++)
    		{
    			for(int k=0;k<n;k++)
    			{
    				ans.a[t][j]=(ans.a[t][j]+a.a[t][k]*b.a[k][j])%mod;
    			}
    		}
    	}
    	return ans;
    }
    mat ans;
    ll quickPow(ll x)
    {
        mat res;
        memset(res.a,0,sizeof(res));
        for(int t=0;t<n;t++)
        {
        	res.a[t][t]=1;
        }
    	while(x)
    	{
    		if(x&1)
    		{
    		  	res=Mul(ans,res);
    		}
    		ans=Mul(ans,ans);
    		x>>=1;
    	}
    	ll ss=0;
    	for(int t=0;t<n;t++)
    	{
    		ss=(ss+res.a[t][t])%mod;
    	}
    	return ss;
    }
    
    int main()
    {
    	
    	int T;
    	cin>>T;
        int k;
    	while(T--)
    	{
    		cin>>n>>k;
    		for(int t=0;t<n;t++)
    		{
    			for(int j=0;j<n;j++)
    			{
    				scanf("%d",&ans.a[t][j]);
    			}
    		}
    		ll s=quickPow(k);
    		cout<<s<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    线程唤醒
    以前、现在
    黑马程序员训练营基础测试
    流程图
    线程同步
    Thread联系
    Java线程
    Java中文件流笔记
    字符串习题
    匿名内部类
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781745.html
Copyright © 2020-2023  润新知