zoukankan      html  css  js  c++  java
  • 快速乘、快速幂(矩阵快速幂)

    当mod一个大数p的时候,还有进行乘法的时候可能会爆long long的时候,就用快速乘或者快速幂。

    参考:http://www.cnblogs.com/whywhy/p/5066730.html

    先上模板:

    快速乘:

    ll multi(ll a,ll b,ll m)
    {
        ll ans=0;
        while(b)
        {
            if(b&1) (ans+=a) %= m;
            (a=a*2) %= m;
            b/=2;
        }
        return ans;
    }

     


    快速幂:

    ll pow_mod(ll a,ll b,ll m)
    {
        ll res=1;
        while(b)
        {
            if(b&1) res=multi(res,a,m);  //这里要用到快速乘
            a=multi(a,a,m);
            b/=2;
        }
        return res;
    }

     快速乘+快速幂 HDU题目链接 题解


    还有一种是:矩阵快速幂,根据题目分析,然后建立相关的矩阵,再用快速幂;

    矩阵快速幂:

    node mult(node a,node b) //进行矩阵的计算
    {
        node t;
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
        {
            t.m[i][j]=0;
            for(int p=0;p<2;p++)
                t.m[i][j]=((t.m[i][j]+a.m[i][p]*b.m[p][j])%MOD+MOD)%MOD;
        }
        return t;
    }
    
    void pow_mod(long long n)
    {
        original.m[0][0]=1,original.m[0][1]=-1;
        original.m[1][0]=1,original.m[1][1]=0;
        ans.m[0][0]=ans.m[1][1]=1;
        ans.m[0][1]=ans.m[1][0]=0;  //将ans初始化成2阶矩阵E
        while(n)
        {
            if(n%2==1)
                ans=mult(ans,original);
            original=mult(original,original);
            n/=2;
        }
    }

     两道矩阵快速幂:

    CF 450B题解      POJ 3070 Fibonacci矩阵快速幂新解法

  • 相关阅读:
    第四周
    第二次作业
    jsp
    软件测试第一次
    增删改查
    用户添加
    登录
    购物商城
    jsp第七周作业
    jsp第六周作业
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5184736.html
Copyright © 2011-2022 走看看