您的位置:首页 > 其它

NYOJ 148 矩阵快速幂模版

2015-05-02 10:01 369 查看
矩阵快速幂,其实就是和快速幂的原理相同的, 只是把两个矩阵相乘。

#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

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