POJ 3070 矩阵快速幂
2019-04-13 15:44发布
生成海报
矩阵幂模;
可以参考:
不同之处,在于,一个是 数字,一个是矩阵;原理都一样;
/*
*problem ID: POJ 3070
* Author ID: fuqiang
* TIME: 2013-07-17
* Algorithm: 幂模
* Status: (Accept)
*/
#include
#include
#include
#include
#include
using namespace std;
#define maxn 2
struct matrix //矩阵
{
__int64 arr[maxn][maxn];
}origin,res;
matrix multiply(matrix a, matrix b) //矩阵乘法
{
matrix temp;
memset(temp.arr,0,sizeof(temp.arr));
for(int i = 0; i < maxn; i++)
{
for(int j = 0; j < maxn; j++)
{
for(int k = 0; k < maxn; k++)
{
temp.arr[i][j] += a.arr[i][k]*b.arr[k][j];
}
}
}
return temp;
}
inline void mod_1w(matrix & k) //mod 10000
{
for(int i = 0; i < maxn; i++)
{
for(int j = 0; j < maxn; j++)
{
k.arr[i][j] %= 10000;
}
}
}
matrix caclo(matrix a,int n,matrix k) //快速幂模
{
mod_1w(a);
while(n)
{
if(n&1)
{
k = multiply(k,a);
mod_1w(k);
}
a = multiply(a,a);
mod_1w(a);
n >>= 1;
}
return k;
}
void InIt()
{
origin.arr[0][0] = origin.arr[0][1] = origin.arr[1][0] = 1;
origin.arr[1][1] = 0;
memset(res.arr,0,sizeof(res.arr));
for(int i = 0; i < maxn; i++) //置为单位阵
res.arr[i][i] = 1;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==-1)
break;
InIt();
matrix ans = caclo(origin,n,res);
printf("%I64d
",ans.arr[0][1]);
}
return 0;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮