您的位置:首页 > 其它

HDU1575 && HDU1757(矩阵入门)

2012-08-02 10:47 162 查看
HDU1575_矩阵的入门题目,比较基础。

/*
*State: 1575    0MS    256K    1916 B    C++
*题目大意:
*        A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),
*        现要求Tr(A^k)%9973。
*解题思路:
*        普通矩阵计算即可。
*解题感想:
*        注意该模板为ndim赋值很重要,这个为实际矩阵的大小。
*/


View Code

#include <stdio.h>
#include <iostream>
#include <string.h>

#define MAX_DIMENSION 11

using namespace std;

typedef int MATRIX_TYPE;
typedef  unsigned __int64 MAX_INT_TYPE; //temporary var to avoid overflowing
typedef MATRIX_TYPE Matrix[MAX_DIMENSION][MAX_DIMENSION];
int ndim = MAX_DIMENSION;
int mod = 9973;//mod

void m_zero(Matrix  x)
{
memset(x, 0, sizeof(MATRIX_TYPE)*MAX_DIMENSION*MAX_DIMENSION);
}

void m_one(Matrix  x)
{
int i;
m_zero(x);
for(i=0;i<ndim;++i)x[i][i]=1;
}

void m_copy(Matrix  src,Matrix  dest)
{
memcpy(dest,src, sizeof(MATRIX_TYPE)*MAX_DIMENSION*MAX_DIMENSION);
}

//c=a*b
void m_multiple(Matrix  a,Matrix b,Matrix c)
{
int i,j,k;
MAX_INT_TYPE t;

for(i=0;i<ndim;i++)
for(j=0;j<ndim;j++)
{
t=0;
if(mod<=1)
for(k=0;k<ndim;k++) t+=a[i][k]*b[k][j];//module
else
for(k=0;k<ndim;k++){
t+=(a[i][k]*(MAX_INT_TYPE)b[k][j])%mod;
t%=mod;
}//module
c[i][j]=t;
}
}

void m_pow(Matrix x, unsigned int n, Matrix y)
{
Matrix temp,temp_x;
m_one(y);
m_copy(x,temp_x);
for(;n;)
{
if ((n & 1) != 0)
{
m_multiple(temp_x,y,temp);
m_copy(temp,y);
}
if ((n >>= 1))
{
m_multiple(temp_x,temp_x,temp);
m_copy(temp,temp_x);
}
}
}

void view_arr(Matrix a, int n)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
cout << a[i][j] << " ";
cout << endl;
}
}

int main(void)
{
#ifndef ONLINE_JUDGE
//freopen("in.txt", "r", stdin);
#endif

int k, m;
while(scanf("%d %d", &k, &m) == 2)
{
Matrix a, ans;
m_zero(a);
ndim = 10;
mod = m;

for(int i = 0; i < 10; i++)
scanf("%d", &a[0][i]);
for(int i = 1; i < 10; i++)
a[i][i - 1] = 1;
if(k < 10)
{
printf("%d\n", k % mod);
continue;
}
//view_arr(a, 10);
m_pow(a, k - 9, ans);
//view_arr(ans, 10);

int res = 0;
for(int i = 0; i < 10; i++)
res = (res + ans[0][i] * (9 - i)) % mod;
printf("%d\n", res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: