• poj 3233(矩阵高速幂)


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

    题意:给出一个公式求这个式子模m的解;

    分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点。本题k的值非常大。所以要用二分求和来降低执行时间。

    代码:

    #include <set>
    #include <map>
    #include <stack>
    #include <queue>
    #include <math.h>
    #include <vector>
    #include <string>
    #include <utility>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    
    using namespace std;
    struct Matrax{
        long long m[50][50];
    }ter;
    int n,m;
    Matrax add(Matrax a,Matrax b){
        Matrax p;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                p.m[i][j]=a.m[i][j]+b.m[i][j];
                p.m[i][j]%=m;
    //            cout<<p.m[i][j]<<" ";
            }
    //        cout<<endl;
        }
        return p;
    }//矩阵加法
    Matrax muli(Matrax a,Matrax b){
        Matrax p;
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            p.m[i][j]=0;
            for(int k=0;k<n;k++){
                p.m[i][j]+=a.m[i][k]*b.m[k][j];
                p.m[i][j]%=m;
            }
        }
        return p;
    }//矩阵乘法
    Matrax quick_mod(Matrax a,int b){
        Matrax ans=ter;
        while(b){
            if(b&1){
                ans=muli(ans,a);
                b--;
            }
            else {
                b>>=1;
                a=muli(a,a);
            }
        }
        return ans;
    }//高速幂
    Matrax sum(Matrax a,int k){
        if(k==1)return a;
        Matrax ans,b;
        ans=sum(a,k/2);
        if(k&1){
            b=quick_mod(a,k/2+1);
            ans=add(ans,muli(ans,b));
            ans=add(ans,b);
        }
        else {
            b=quick_mod(a,k/2);
            ans=add(ans,muli(ans,b));
        }
        return ans;
    }//二分求和
    int main(){
        int k;
        while(scanf("%d%d%d",&n,&k,&m)!=EOF){
            Matrax A,tmp;
            for(int i=0;i<n;i++)
            for(int j=0;j<n;j++){
                scanf("%I64d",&A.m[i][j]);
                ter.m[i][j]=(i==j);
                tmp.m[i][j]=0;
            }
            tmp=sum(A,k);
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                cout<<tmp.m[i][j]<<" ";
                cout<<endl;
            }
    
        }
        return 0;
    }
    


  • 相关阅读:
    天国近了(一) 揭穿OOP神话
    自然思考:流程任意定制的一个问题
    风水占卜是迷信吗?
    飘浮的鸡蛋壳真正的原理研究
    ListView
    Java与WCF交互(一):Java客户端调用WCF服务 (转)
    WPF ListView 数据绑定
    .NET中Trace类和Debug类的应用举例(转)
    Print Visual Tree
    EntityFramework之领域驱动设计实践(六)(转)
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7133303.html
Copyright © 2020-2023  润新知