矩阵乘法 (Size*Size)
class mat{
const static int Size=10;
unsigned long long a[Size][Size];
friend::mat operator*(const mat&a, const mat&b)
{
mat c;
for(int i=0;i<Size;i++)
for(int j=0;j<Size;j++){
unsigned long long *temp=&c.a[i][j]; *temp=0;
for(int k=0;k<Size;k++) *temp+=a.a[i][k]*b.a[k][j];
}
return c;
}
};
Fibonacci 矩阵还可以这样写
class fibmat{
long long a,b,c;
friend::fibmat operator*(const fibmat&a, const fibmat&b)
{
fibmat c;
c.a=a.a*b.a+a.b*b.b;
c.b=a.a*b.b+a.b*b.c;
c.c=a.b*b.b+a.c*b.c;
return c;
}
};
快速幂
template <class type>
type power(type a,type b) // 要求b>0
{
type t=a; b--;
for(;b;b>>=1)(b&1)?t=t*a:0;a=a*a;
return t;
}
template <class Type>
Type power(Type a,int b)
{
Type t=Type::ZERO;
for(;b;b>>=1)(b&1)?t=t*a:0;a=a*a;
return t;
}
对应的矩阵构造
class mat{
public:
const static int Size=10;
static const mat ZERO;
unsigned long long a[Size][Size];
mat(int x=0){
memset(a,0,sizeof(a));
if(x==-1)
for(int i=0;i<Size;i++)a[i][i]=1;
}
friend::mat operator*(const mat&a, const mat&b)
{
mat c;
for(int i=0;i<Size;i++)
for(int j=0;j<Size;j++){
unsigned long long *temp=&c.a[i][j]; *temp=0;
for(int k=0;k<Size;k++) *temp+=a.a[i][k]*b.a[k][j];
}
return c;
}
};
const mat mat::ZERO=mat(-1);
数据类快速幂
template <class Type>
Type Power(Type a,int b)
{
Type t = 1;
for(;b;b>>=1)(b&1)?t=t*a:0;a=a*a;
return t;
}