矩阵快速幂 3070

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 2;
const int MOD = 10000;

int n;//是幂

struct MATRIX
{
    int mat[2][2];
};

MATRIX multiply(MATRIX a,MATRIX b,int n)//n是规模
{
    MATRIX c;
    memset(c.mat,0,sizeof(c.mat));
    for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
            if(a.mat[i][k])
                for(int j=0;j<n;j++)
                    if(b.mat[k][j])
                    {
                        c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                        if(c.mat[i][j]>=MOD)
                            c.mat[i][j]%=MOD;
                    }
    return c;
}

MATRIX E;

void quick(MATRIX a,int n)//幂
{
    memset(E.mat,0,sizeof(E.mat));
    for(int i = 0; i < N ; i++)
        E.mat[i][i] = 1;
    while(n)
    {
        if(n&1)
            E = multiply(E,a,N);
        n>>=1;
        a = multiply(a,a,N);
    }

}

int main()
{
    MATRIX A1,T;
    while(scanf("%d",&n) &&n != (-1))
    {
        if(n==0)
            printf("0\n");
        else
        {
            T.mat[0][0] = 1;
            T.mat[0][1] = 1;
            T.mat[1][0] = 1;
            T.mat[1][1] = 0;
            A1.mat[0][0] = 1;
            A1.mat[0][1] = 0;
            quick(T,n-1);
            printf("%d\n",multiply(A1,E,N).mat[0][0]);
        }
    }
}

poj 3233

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int N1 = 60;
const int N2 = 30;

struct MAT1
{
    int mat[N1][N1];
};

struct MAT2
{
    int mat[N2][N2];
};

int N,K,MOD;//N是规模,K是幂,MOD是取余
MAT1 T;
MAT1 S;

void add1(MAT2 a)//T
{
    memset(T.mat,0,sizeof(T.mat));
    for(int i = 0 ; i < N; i++)
       T.mat[i][i] = 1;
    for(int i = 0 ;i < N ; i++)
        for(int j  = N; j < 2*N ; j++ )
            T.mat[i][j] = a.mat[i][j - N];
    for(int i = N ; i < 2*N; i++)
        for(int j = N ; j < 2*N ;j++)
            T.mat[i][j] = a.mat[i-N][j-N];
}


MAT1 multiply(MAT1 a,MAT1 b, int n)//
{
    MAT1 c;
    memset(c.mat,0,sizeof(c.mat));
    for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
            if(a.mat[i][k])
                for(int j=0;j<n;j++)
                    if(b.mat[k][j])
                    {
                        c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                        if(c.mat[i][j]>=MOD)
                            c.mat[i][j]%=MOD;
                    }
	    return c;
}


MAT1 quick(MAT1 a,int n)//mi
{
    MAT1 E;
    memset(E.mat,0,sizeof(E.mat));
    for(int i = 0 ; i < 2*N ; i++)
        E.mat[i][i] = 1;
    while(n)
    {
        if(n&1)
            E = multiply(E,a,2*N);
        n>>=1;
        a = multiply(a,a,2*N);

    }
    return E;
}
MAT1 O;

void add2(MAT2 a)
{
    memset(O.mat,0,sizeof(O.mat));
    for(int i = 0 ; i < N ; i++)
        for(int j  = 0; j < N ; j++ )
            O.mat[i][j] = a.mat[i][j];
    for(int i = N ; i < 2*N ; i++)
        for(int j  = 0; j < N ; j++ )
            O.mat[i][j] = a.mat[i-N][j];
}

int main()
{

    scanf("%d%d%d",&N,&K,&MOD);
    MAT2 A;
    for(int i = 0 ; i < N ; i++)
        for(int  j = 0 ; j < N ;j++)
            scanf("%d",&A.mat[i][j]);
    add1(A);
    T = quick(T,K-1);//E
    add2(A);
    S = multiply(T,O,2*N);

    for(int i = 0 ; i < N ;i++)
    {
        for(int j = 0 ; j < N ; j++)
        {
            if(j==0)
                printf("%d",S.mat[i][j]);
            else
                printf(" %d",S.mat[i][j]);
        }
        printf("\n");
    }

}

poj 2276

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
const int MAXN = 100;

using namespace std;
typedef struct MATRIX
{
    int mat[MAXN][MAXN];
}MAT;

int N,K;
int MOD = 2;
MAT light;
MAT T;

MAT multiply(MAT a,MAT b,int n)//矩阵乘法
{
    MAT c;
    memset(c.mat,0,sizeof(c));
      for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
            if(a.mat[i][k])
                for(int j=0;j<n;j++)
                    if(b.mat[k][j])
                    {
                        c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                            if(c.mat[i][j]>=MOD)
                                c.mat[i][j]%=MOD;
                    }
    return c;
}

MAT quick(MAT a,int n)//矩阵快速幂
{
    MAT E;
    memset(E.mat,0,sizeof(E.mat));
    for(int i = 0; i < N ; i++)
         E.mat[i][i] = 1;
    while(n>0)
    {
        if(n&1)
            E = multiply(E,a,N);
        n>>=1;
        a = multiply(a,a,N);
    }
    return E;
}

int main()
{
    int K;
    string a;
    while(scanf("%d",&K)!=EOF)
    {
        cin >> a;
        N = a.length();
        memset(light.mat,0,sizeof(light.mat));
        memset(T.mat,0,sizeof(T.mat));
        for(int i = 0 ; i < N ;i++)
            light.mat[i][0] = (a[i]-'0');//灯最初的状态

        for(int i = 0 ; i < N ; i++)//构造系数矩阵
        {
            if(i == 0)
            {
                T.mat[i][0] = 1;
                T.mat[i][N-1] = 1;
            }
            else
            {
                T.mat[i][i-1] = 1;
                T.mat[i][i] = 1;
            }
        }
        T = quick(T,K);
        light = multiply(T,light,N);
        for(int i = 0 ; i < N; i++ )
        {
            printf("%d",light.mat[i][0]);
        }
        printf("\n");
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/Xuedan_blog/article/details/80104047
今日推荐