ahu 395 快速矩阵幂初学 + 矩阵快速幂模板

来源:互联网 发布:搜索引擎怎么数据分析 编辑:程序博客网 时间:2024/05/21 22:34
#include <cstdio>#include <string>#include <cmath>#include <iostream>using namespace std;const long long M = 10003;const long long N = 3;long long t,b,c=0,f1,f2;struct Node  //矩阵{    long long line,cal;    long long a[N+1][N+1];    Node(){        line=3,cal=3;        a[0][0] = b; a[0][1] = 1; a[0][2] = 0;        a[1][0] = t; a[1][1] = 0; a[1][2] = 0;        a[2][0] = c; a[2][1] = 0; a[2][2] = 1;    }};Node isit(Node x,long long c)  //矩阵初始化{    for(long long i=0;i<N;i++)        for(long long j=0;j<N;j++)            x.a[i][j]=c;    return x;}Node Matlab(Node x,Node s)  //矩阵乘法{    Node ans;    ans.line = x.line,ans.cal = s.cal;    ans=isit(ans,0);    for(long long i=0;i<x.line;i++)    {        for(long long j=0;j<x.cal;j++)        {            for(long long k=0;k<s.cal;k++)            {                ans.a[i][j] += x.a[i][k]*s.a[k][j];                ans.a[i][j]=(ans.a[i][j]+M)%M;            }        }    }    return ans;}long long Fast_Matrax(long long n)  //矩阵快速幂{    if(n==1)        return f1;    n-=2;    long long x=1,f=n,ok=1;    Node ans,tmp,ch;    ans.line = 1,ans.cal = 3;    ans.a[0][0] = f2, ans.a[0][1] = f1 ,ans.a[0][2] = 1;    while(n>0)    {        if(n%2)        {            ans=Matlab(ans,tmp);        }        tmp=Matlab(tmp,tmp);        n/=2;    }    return ans.a[0][0];}int main(){    long long n,T;    while(1)    {        scanf("%lld%lld%lld%lld%lld",&f1,&f2,&b,&t,&n);        if(f1==0&&f2==0&&b==0&&t==0&&n==0)break;        printf("%lld\n",Fast_Matrax(n));    }    return 0;}
//模板int n,k,b,mod = 2;char c[500];//快速幂struct ma{     int m[115][115],row,col;     ma()     {         memset(m,0,sizeof(m));         row = col = 0;     }     ma operator * (ma ma1) //乘     {        ma ans;        ans.row = row;        ans.col = ma1.col;        for(int i = 1;i <= ans.row;i++)            for(int j = 1;j <= ans.col;j++)            {                for(int k = 1;k <= col;k++)                {                    ans.m[i][j] += (m[i][k] * ma1.m[k][j]);                }                 ans.m[i][j] %= mod;            }        return ans;     }     ma operator + (ma ma1) //加     {         ma ans;         ans.row = row;         ans.col = col;         for(int i = 1;i <= row;i++)             for(int j = 1;j <= col;j++)                 {                    ans.m[i][j] =  ma1.m[i][j] + m[i][j];                    ans.m[i][j] %= mod;                 }          return  ans;     }     ma operator^(int n)  // 快速幂     {         ma ans,ma1;         ans.row = row; ans.col = col;         for(int i = 1;i <= row;i++)             ans.m[i][i] = 1;         ma1.row = row;  ma1.col = col;         for(int i = 1;i <= row;i++)             for(int j = 1;j <= col;j++)                  ma1.m[i][j] = m[i][j];         while(n)         {            if(n&1)ans = ans * ma1;            ma1 = ma1 * ma1;            n >>= 1;         }         return ans;     }     void debug()     {         for(int i = 1;i <= row;i++)         {             for(int j = 1;j <= col;j++)                 printf("%d ",m[i][j]);             printf("\n");         }     }};
0 0
原创粉丝点击