您的位置:首页 > 其它

Tr A--hdu1575(矩阵快速幂)

2016-03-15 20:33 316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575

算是模板吧

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <vector>
#include <map>

using namespace std;

typedef long long LL;

#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
#define N 15
#define MOD 9973

struct node
{
int a

;
};

int n, k;

node mul(node p, node q)
{
node temp;

for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
temp.a[i][j] = 0;
for(int k=0; k<n; k++)
temp.a[i][j] = (temp.a[i][j]+p.a[i][k]*q.a[k][j])%MOD;
}
}
return temp;
}

node Pow(node A, int m)
{
node temp;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
temp.a[i][j] = 0;
}
temp.a[i][i] = 1;
}
while(m)
{
if(m % 2)
temp = mul(temp, A);
m/=2;
A = mul(A, A);
}
return temp;
}

int slove(node A)
{
node ans = Pow(A, k);

int sum = 0;

for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j)
sum = (sum + ans.a[i][j]) % MOD;
}
}
return sum;
}

int main()
{
int T;

scanf("%d", &T);

while(T--)
{
node A;

scanf("%d %d", &n, &k);

for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)

scanf("%d", &A.a[i][j]);
}
int ans = slove(A);

printf("%d\n", ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: