标签:
矩阵快速幂
首先知道矩阵
矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合;
矩阵乘法:
给一个简单的练习题: 点击打开链接
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <bitset>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;
typedef long long LL;
const int INF=2e9+1e8;
const int MOD=1000007;
const int MAX_SIZE=1005;
const int MM=3;
LL f1,f2,a,b,c,n;
struct Mat
{
LL maze[MM][MM];
void set_empty()
{
memset(maze,0,sizeof(maze));
}
};
Mat unit_Mat=
{
1,0,0,
0,1,0,
0,0,1
}; // 定义一个单位矩阵,任何一个矩阵 乘以 单位矩阵,其值等于本身;
Mat operator *(Mat a,Mat b) // 重载运算符 * // 定义两个矩阵的乘法,根据矩阵乘法的定义来写
{
Mat c;
c.set_empty(); // 一定要设置为空。清零数组;不然后面加等一个数会有垃圾值
LL i,j,k;
for(i=0; i<MM; i++)
{
for(j=0; j<MM; j++)
{
for(k=0; k<MM; k++)
{
c.maze[i][j]+=a.maze[i][k] * b.maze[k][j];
c.maze[i][j] %= MOD;
}
}
}
return c;
}
Mat operator^(Mat a,LL N) // 优化时间的就在此处,
// 类似与一般的int 数字的快速幂求值,思想是一样的。不懂可百度快速幂。
{
Mat c=unit_Mat;
while(N)
{
if(N&1) c=a*c;
a=a*a;
N>>=1;
}
return c;
}
void solve()
{
Mat A,B;
B.set_empty();
A.set_empty();
B.maze[0][0]=b,B.maze[1][0]=a,B.maze[2][0]=c;
B.maze[0][1]=B.maze[2][2]=1;
B=B^(n-2);
A.maze[0][0]=f2,A.maze[0][1]=f1,A.maze[0][2]=1;
LL ans=0;
Mat C=A*B;
printf("%lld\n",(C.maze[0][0]+MOD)%MOD);
}
int main()
{
int times;
scanf("%d",×);
while(times--)
{
scanf("%lld %lld %lld %lld %lld %lld",&f1,&f2,&a,&b,&c,&n);
if(n == 1)
printf("%lld\n",(f1+MOD)%MOD);
else if(n == 2)
printf("%lld\n",(f2+MOD)%MOD);
else solve(); // 其上位特判 因为公式的定义域是 n>=3;
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/wr_technology/article/details/51333886