POJ 3070 矩阵快速幂

来源:互联网 发布:卸载软件残留 编辑:程序博客网 时间:2024/05/17 03:32

矩阵幂模;

可以参考:

 

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 2struct 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;}