poj3233
此处仅提供代码:
//问题:题目大意:已知一个 n*n 的矩阵 A,计算
//S =A +A 2 +A 3 + … +A k , S 的值对 m 取模
#include<stdio.h>
#include<string.h>
struct node
{
int p[65][65];
};
int mod, len;
struct node mult(struct node a, struct node b)//矩阵a*b
{
int i, j, k;
struct node c;
for(i = 1; i <=len; i++)
{
for(j = 1; j <=len; j++)
{
c.p[i][j] = 0;//新创建矩阵为0矩阵
for (k = 1; k <= len; k++)
{
c.p[i][j] = (a.p[i][k] * b.p[k][j] + c.p[i][j]) % mod;//相乘后对结果求模
}
}
}
return c;
}
struct node quickpow(struct node a, struct node b, int n)//求矩阵快速幂
{
while (n)
{
if (n % 2 == 1)
b = mult(b, a);
n = n / 2;
a = mult(a, a);
}
return b;
}
int main()
{
int i, j, n, k;
struct node a, b;
while (scanf("%d%d%d", &n, &k, &mod) != EOF)
{
len = n * 2;
for (i = 1; i <= n; i++) //输入矩阵A;
{
for (j = 1; j <= n; j++)
scanf("%d", &a.p[i][j]);
}
for (i = 1; i <= n; i++) //右上角单位矩阵
{
for (j = n + 1; j <= n * 2; j++)
if (i + n == j)
a.p[i][j] = 1;
else
a.p[i][j] = 0;
}
for (i = n + 1; i <= n * 2; i++) //左下角0矩阵
for (j = 1; j <= n; j++)
a.p[i][j] = 0;
for (i = n + 1; i <= 2 * n; i++) //右下角单位矩阵
for (j = n + 1; j <= n * 2; j++)
if (i == j)
a.p[i][j] = 1;
else
a.p[i][j] = 0;
for (i = 1; i <= n * 2; i++) //把b变成单位矩阵
for (j = 1; j <= n * 2; j++)
if (i == j)
b.p[i][j] = 1;
else
b.p[i][j] = 0;
a = quickpow(a, b, k + 1);
for (i = 1; i <= n; i++) //减去单位矩阵
for (j = n + 1; j <= len; j++)
{
if (i + n == j)
a.p[i][j]--;
while (a.p[i][j] < 0) //为了防止溢出
a.p[i][j] += mod;
}
for (i = 1; i <= n; i++) //打印输出
{
for (j = n + 1; j < len; j++)
printf("%d ", a.p[i][j]);
printf("%d\n", a.p[i][len]);
}
}
return 0;
}

浙公网安备 33010602011771号