NYOJ 148 矩阵快速幂模版

来源:互联网 发布:ajax post json data 编辑:程序博客网 时间:2024/06/01 23:51

矩阵快速幂,其实就是和快速幂的原理相同的, 只是把两个矩阵相乘。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int N = 2;const int mod = 10000;struct Node{    int row, cal;    int s[N][N];    Node ()//需要构造的矩阵    {        row = cal = N;        s[0][0] = 1, s[0][1] = 1;        s[1][0] = 1, s[1][1] = 0;    }};Node Matble(Node x, Node y)//矩阵的乘法{    Node ans;    ans.row = x.row;    ans.cal = y.cal;    for(int i = 0; i < ans.row; i++)        for(int j = 0; j < ans.cal; j++)            ans.s[i][j] = 0;    for(int i = 0; i < ans.row; i++)//两个矩阵相乘        for(int j = 0; j < ans.cal; j++)            for(int k = 0; k < x.cal; k++)               ans.s[i][j] = (int)(ans.s[i][j] + (long long)x.s[i][k] * y.s[k][j] % mod) % mod;//技巧,相乘可能超int    return ans;}int pow_Matble(int n) //快速幂{    if(!n)        return 0;    Node ans, temp;    ans.s[0][0] = 1, ans.s[0][1] = 0;    ans.s[1][0] = 0, ans.s[1][1] = 1;    while(n > 0)    {        if(n&1)            ans = Matble(ans, temp);//改成矩阵相乘        temp = Matble(temp, temp);//改成矩阵相乘        n /= 2;    }    return ans.s[0][1];//返回矩阵中我们需要的结果}int main(){    int n;    while(scanf("%d", &n), n >= 0)        printf("%d\n", pow_Matble(n));    return 0;}


0 0
原创粉丝点击