您的位置:首页 > 大数据 > 人工智能

uva 10655 Algebraic Problem(矩阵快速幂)

2013-09-10 16:33 351 查看
已知:
     p = a + b;
     q = a * b;
 求:
     a^n + b^n

 构造矩阵:
     X(n) = a^n + b^n; 
     ……
     X(0) = 2;
     X(1) = a + b = p;

 X(n) = (a + b) * X(n-1) - a * b * X(n-2);
    
   | (a + b)  - a * b |     | X(n-1)|     |X(n)  |  
   |                  |  *  |       |  =  |      |
   |    1         0   |     | X(n-2)|     |X(n-1)|  

代码如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll unsigned long long

typedef struct
{
ll m[2][2];
}Matrix;

Matrix A, B, per;
ll MOD;
void init(ll p, ll q)
{
A.m[0][0] = p, A.m[1][0] = 2;

B.m[0][0] = p, B.m[0][1] = q;
B.m[1][0] = 1, B.m[1][1] = 0;

per.m[0][0] = 1, per.m[0][1] = 0;
per.m[1][0] = 0, per.m[1][1] = 1;

}

Matrix multi(Matrix a, Matrix b)
{
Matrix c;
for(int i = 0; i < 2; i ++)
{
for(int j = 0; j < 2; j ++)
{
c.m[i][j] = 0;
for(int k = 0; k < 2; k ++)
{
c.m[i][j] = c.m[i][j] + (a.m[i][k] * b.m[k][j]) ;
}

}
}
return c;
}

Matrix Power(int k)
{
Matrix ans = per, p = B;
while(k)
{
if(k & 1) ans = multi(ans, p);
k >>= 1;
p = multi(p, p);
}
return ans;
}

ll  GetAns(Matrix a, Matrix b)
{
ll ans = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0] ;
return ans;
}
int  main()
{
int t;
ll  p, q, n;
scanf("%d", &t);
for(int i = 1; i <= t; i ++)
{
scanf("%llu %llu %llu", &p, &q, &n);
if(n == 0)
{
printf("Case %d: 2\n", i);
continue;
}
init(p, -q);
Matrix ans = Power(n-1);
ll res = GetAns(ans, A);
printf("Case %d: %llu\n", i, res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  矩阵快速幂