hdu1575 Tr A(矩阵快速幂)

来源:互联网 发布:淘宝宝贝关联阿里巴巴 编辑:程序博客网 时间:2024/06/10 07:55

题目:

Tr A

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


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
22 21 00 13 999999991 2 34 5 67 8 9
 

Sample Output
22686
 

Author
xhd
 

Source
HDU 2007-1 Programming Contest

题意:给一个矩阵,求出A^k的迹。
思路:裸的矩阵快速幂。

代码:
#include <cstdlib>#include <cctype>#include <cstring>#include <cstdio>#include <cmath>#include<climits>#include <algorithm>#include <vector>#include <string>#include <iostream>#include <sstream>#include <map>#include <set>#include <queue>#include <stack>#include <fstream>#include <numeric>#include <iomanip>#include <bitset>#include <list>#include <stdexcept>#include <functional>#include <utility>#include <ctime>using namespace std;#define PB push_back#define MP make_pair#define REP(i,x,n) for(int i=x;i<(n);++i)#define FOR(i,l,h) for(int i=(l);i<=(h);++i)#define FORD(i,h,l) for(int i=(h);i>=(l);--i)#define SZ(X) ((int)(X).size())#define ALL(X) (X).begin(), (X).end()#define RI(X) scanf("%d", &(X))#define RII(X, Y) scanf("%d%d", &(X), &(Y))#define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))#define DRI(X) int (X); scanf("%d", &X)#define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)#define OI(X) printf("%d",X);#define RS(X) scanf("%s", (X))#define MS0(X) memset((X), 0, sizeof((X)))#define MS1(X) memset((X), -1, sizeof((X)))#define LEN(X) strlen(X)#define F first#define S second#define Swap(a, b) (a ^= b, b ^= a, a ^= b)#define Dpoint  strcut node{int x,y}#define cmpd int cmp(const int &a,const int &b){return a>b;} /*#ifdef HOME    freopen("in.txt","r",stdin);    #endif*/const int MOD = 1e9+7;typedef vector<int> VI;typedef vector<string> VS;typedef vector<double> VD;typedef long long LL;typedef pair<int,int> PII;//#define HOMEint Scan(){int res = 0, ch, flag = 0;if((ch = getchar()) == '-')//判断正负flag = 1;else if(ch >= '0' && ch <= '9')//得到完整的数res = ch - '0';while((ch = getchar()) >= '0' && ch <= '9' )res = res * 10 + ch - '0';return flag ? -res : res;}/*----------------PLEASE-----DO-----NOT-----HACK-----ME--------------------*/int a[15][15];int n,k;void multi(int a[][15],int b[][15],int ans[][15]){    int c[15][15];    MS0(c);    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        for(int k=0;k<n;k++)    {        c[i][j]=(c[i][j]+a[i][k]*b[k][j])%9973;    }    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        ans[i][j]=c[i][j];}void mypow(int a[][15],int k,int ans[][15]){    int temp[15][15];    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        temp[i][j]=a[i][j];    while(k)    {        if(k&1)            multi(ans,temp,ans);        multi(temp,temp,temp);        k>>=1;    }}int ans[15][15];int main(){int T;RI(T);while(T--){    RII(n,k);    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)        RI(a[i][j]);   MS0(ans);   for(int i=0;i<n;i++)        ans[i][i]=1;   mypow(a,k,ans);   int res=0;   for(int i=0;i<n;i++)    res=(res+ans[i][i])%9973;   printf("%d\n",res);}        return 0;}



0 0