POJ 3233 矩阵运算,等比数列二分求和,矩阵

原创 2016年08月31日 00:26:51
#include"iostream"
#include"stdio.h"
#include"string.h"
using namespace std;
struct Mat{
    int res[45][45];
    Mat(){memset(res,0,sizeof(res));}
}I;
int n,m,k;
Mat mut(Mat a,Mat b) //矩阵乘法
{
    Mat c;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
    {
        for(int k=0;k<n;k++)
            c.res[i][j]+=a.res[i][k]*b.res[k][j];
        c.res[i][j]%=m;
    }
    return c;
}
Mat add(Mat a,Mat b)         //矩阵加减
{
    Mat c;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            c.res[i][j]=a.res[i][j]+b.res[i][j];
            c.res[i][j]%=m;
        }

    }
    return c;
}

Mat pow(Mat a,int cnt)
{
    Mat E=I,p=a;
    while(cnt)
    {
        if(cnt%2)           
        {
            E=mut(E,p);                    //任何矩阵 矩阵都是保持不变的
            cnt--;
        }
        cnt/=2;
        p=mut(p,p);
    }
    return E;
}

Mat sum(Mat a,int cnt)  //等比数列二分求和
{
    if(cnt==1) return a;
    Mat t=sum(a,cnt/2);
    if(cnt%2)
    {
        Mat cur=pow(a,cnt/2+1);
        t=add(t,mut(t,cur));
        t=add(cur,t);
    }
    else
    {
        Mat cur=pow(a,cnt/2);
        t=add(t,mut(t,cur));
    }
    return t;
}

void print(Mat a)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        cout<<a.res[i][j]<<" ";
        cout<<endl;
    }
}



int main()
{
    while(cin>>n>>k>>m)
    {
        Mat a;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
        {
            scanf("%d",&a.res[i][j]);
            a.res[i][j]%=m;           //一定要有
            if(i==j) I.res[i][j]=1;else I.res[i][j]=0;
        }
        Mat ans=sum(a,k);
        print(ans);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

等比数列二分求模

//等比数列二分求模 int PowMod(int a,int b,int c) { int result=1; int base=a%c; while(b) { ...
  • qq_33901573
  • qq_33901573
  • 2016年07月28日 19:13
  • 106

【例题&结论】【分治(等比数列二分求和)】NKOJ 3716 数列求和

NKOJ 3716 数列求和 时间限制 : - MS 空间限制 : 65536 KB 评测说明 : 时限1000ms 问题描述 给出三个整数A,n和p,计算 Sn=(A^1+A^2+...
  • Y__XV
  • Y__XV
  • 2016年07月18日 13:15
  • 243

矩阵经典题目三:poj 3233 Matrix Power Series(等比矩阵求和)

http://poj.org/problem?id=3233 ps转: 用二分方法求等比数列前n项和:即   原理:   (1)若n==0   (2)若n%2==0     ...
  • u013081425
  • u013081425
  • 2014年06月12日 17:13
  • 1272

等比数列二分求和取模

Sn= a+a2+...+an 要求 Sn mod p 如果用公式算,可能溢出,因此用二分法求 1) 若 n是偶数 Sn= a+...+ a^(n/2) +  a^(n/2+1) +  a^(n/2+...
  • qq_34446253
  • qq_34446253
  • 2016年08月05日 10:08
  • 180

矩阵十大经典题目之三-POJ-3233-Matrix Power Series-两次二分

如果k为偶数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)    如果k为奇数,那么(A+A^2+....A^K) = (A+...+A...
  • rowanhaoa
  • rowanhaoa
  • 2014年03月11日 16:48
  • 1874

等比数列取模求和公式(数字,矩阵皆可)

假设是2*2的矩阵吧,数字类比即可 代码: struct Matrix { long long ma[2][2]; }; Matrix res; Matrix mult(Matrix A,...
  • acm_cxq
  • acm_cxq
  • 2016年07月19日 09:29
  • 703

等差、等比数列的求和公式

等差数列和公式 Sn=n(a1+an)/2=na1+n(n-1)/2 d 等比数列求和公式 q≠1时 Sn=a1(1-q^n)/(1-q)=(a1-anq)/(1-q) q=1时Sn=na1 (a1为...
  • kwame211
  • kwame211
  • 2017年12月01日 14:39
  • 138

POJ-1845-Sumdiv 等比数列求和/数学/(二分法/逆元法/变换取模法)

题意:输入a,b,求a^b的所有因子之和 http://poj.org/problem?id=1845 分解a的质因数a=p1^t1*p2^t1........ 每个质因数对sum的贡献...
  • viphong
  • viphong
  • 2016年02月19日 23:42
  • 592

C语言OJ项目参考(1609) 等比数列

(1609) 等比数列 Description 已知q与n,求等比数列之和: 1+q+q2+q3+q4+…+qn1+q+q^2+q^3+q^4+…+q^n Input 输入数据含有不多于50对...
  • sxhelijian
  • sxhelijian
  • 2016年10月26日 20:32
  • 1144

第九周:C语言:等比数列

问题:等比数列的求和 代码: #include int main() { int n,i; double q,sum,a; while(scanf("%d %lf...
  • YanChunxiang
  • YanChunxiang
  • 2016年10月27日 09:28
  • 991
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3233 矩阵运算,等比数列二分求和,矩阵
举报原因:
原因补充:

(最多只允许输入30个字)