码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵运算+快速幂+二分法 poj 3233

时间:2014-09-27 20:26:50      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   for   sp   div   

题目链接:http://poj.org/problem?id=3233

思路:矩阵运算,快速幂,二分法。。  妈的 b>>=1 我写成了b>>=2 wrong了一天。 真棒  

如何求a+a^2+a^3+ ..... a^n = ?

用二分思想做:我们用S(n/2) =  (a+a^2+a^3+...a^n/2);

即 n为奇数时 S(n) = S(n-1) + a^n;

  n为偶数时候 S(n) = S(n/2) + S(n/2)*a^n/2;

 

知道这个就好办了~   注意细节~。。。。

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int n,m,k;

struct Matrix
{
    int data[31][31];
    
    void init()
    {
        memset(data,0,sizeof(data));
        for(int i=0;i<=30;i++)
            data[i][i] = 1;
    }
};

Matrix temp;

//矩阵乘法 
Matrix mul(Matrix a, Matrix b)
{
    Matrix res={{0}} ;
    for(int i = 0 ; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            res.data[i][j] = 0;
            for(int k= 0; k < n; k++)
            {
                res.data[i][j] = res.data[i][j] + (a.data[i][k] * b.data[k][j])%m;
                res.data[i][j] %= m;
            }
        }
    }
    return res;
}

//矩阵加法 
Matrix add(Matrix a, Matrix b)
{
    Matrix res;
    res.init();
    for(int i = 0 ; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            res.data[i][j] = a.data[i][j] + b.data[i][j];
            res.data[i][j] %= m;
        }
    }
    return res;
}


//矩阵快速幂 
Matrix power(Matrix a, int b)
{
    Matrix res;
    res.init();
    
    while(b!=0)
    {
        if(b%2==1)
        {
            res = mul(res,a);
        }
        b >>= 1;
        a = mul(a,a);
    }
    return res;
}

//二分法解决 
Matrix solve(int x)
{
    if(x==1)
        return temp;
    Matrix res,cur;
    if(x&1)
    {
        res = solve( x - 1);
        cur=power(temp,x);
        res=add(res,cur);
    }
    else{
        cur=power(temp,x/2);
        res = solve(x/2);
        res=add(res,mul(cur,res));
    }
    return res;
}

int main()
{
    scanf("%d %d %d",&n,&k,&m);
    //读取 
        for(int i = 0; i < n;i++)
        {
            for(int j = 0;j<n;j++)
            {
                scanf("%d",&temp.data[i][j]);
            }
        }
        
        Matrix s;
        
        s = solve(k);
        
        for(int i=0;i < n;i++)
        {
            for(int j=0;j < n-1;j++)
            {
                printf("%d ",s.data[i][j]);
            }
            printf("%d\n",s.data[i][n-1]);
        }
    
    return 0;
}

 

矩阵运算+快速幂+二分法 poj 3233

标签:style   blog   http   color   io   os   for   sp   div   

原文地址:http://www.cnblogs.com/ltwy/p/3997011.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!