矩阵优化的模板(用的时候注意要修改呀)

来源:互联网 发布:node实战 编辑:程序博客网 时间:2024/04/30 05:12

1.这个是我在算概率dp的时候用的一个~是浮点数啦,然后没有取余操作的~

struct Matrix{    double mat[2][2];};Matrix mul(Matrix a,Matrix b){    Matrix ret;    for(int i=0;i<2;i++)      for(int j=0;j<2;j++)      {          ret.mat[i][j]=0;          for(int k=0;k<2;k++)            ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j];      }    return ret;}Matrix pow_M(Matrix a,int n){    Matrix ret;    memset(ret.mat,0,sizeof(ret.mat));    for(int i=0;i<2;i++)ret.mat[i][i]=1;    Matrix temp=a;    while(n)    {        if(n&1)ret=mul(ret,temp);        temp=mul(temp,temp);        n>>=1;    }    return ret;}


2.这个是看的bin神的,可以取余的~是longlong的..

code:

#include <stdio.h>#include <algorithm>#include <iostream>#include <string.h>using namespace std;const int MOD=1e9+7;struct Matrix{    long long mat[2][2];};Matrix mul(Matrix a,Matrix b){    Matrix ret;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)        {            ret.mat[i][j]=0;            for(int k=0;k<2;k++)            {                ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j];                ret.mat[i][j]%=(MOD-1);            }        }    return ret;}Matrix pow_M(Matrix a,int n){    Matrix ret;    memset(ret.mat,0,sizeof(ret.mat));    ret.mat[0][0]=ret.mat[1][1]=1;    Matrix temp=a;    while(n)    {        if(n&1)ret=mul(ret,temp);        temp=mul(temp,temp);        n>>=1;    }    return ret;}long long pow_m(long long a,long long n){    long long ret=1;    long long temp=a%MOD;    while(n)    {        if(n&1)        {            ret*=temp;            ret%=MOD;        }        temp*=temp;        temp%=MOD;        n>>=1;    }    return ret;}int main(){    int a,b,n;    Matrix tmp;    tmp.mat[0][0]=0;    tmp.mat[0][1]=tmp.mat[1][0]=tmp.mat[1][1]=1;    while(scanf("%d%d%d",&a,&b,&n)==3)    {        Matrix p=pow_M(tmp,n);        //printf("%d %d %d %d\n",p.mat[0][0],p.mat[1][0],p.mat[0][1],p.mat[1][1]);        int ans=(pow_m(a,p.mat[0][0])*pow_m(b,p.mat[1][0]))%MOD;        printf("%d\n",ans);    }    return 0;}

题目是在这里了:http://www.cnblogs.com/kuangbin/archive/2013/05/21/3090793.html





ps:窝学了新的用法会再加上的...orz


0 0