您的位置:首页 > 其它

POJ 3070 矩阵快速幂

2013-07-17 13:11 246 查看
矩阵幂模;

可以参考:


HDU 1420 蒙哥马利幂模算法


不同之处,在于,一个是 数字,一个是矩阵;原理都一样;


/*
*problem ID: POJ 3070
* Author ID: fuqiang
*      TIME: 2013-07-17
* Algorithm: 幂模
*    Status: (Accept)
*/

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
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\n",ans.arr[0][1]);
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: