矩阵乘法

来源:互联网 发布:linux服务器端口开放 编辑:程序博客网 时间:2024/06/05 20:11

构造一个
1 1 0
0 0 1
1 0 0的矩阵
然后乱搞乘法
注意最后输出为ans[1][1]+ans[2][1]+ans[3][1];

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <stdio.h>#include <cstring>using namespace std;#define int long long#define p 1000000007typedef int arr[4][4];int n,m,k;int st,en;int ans[4][4];int a[4][4],temp[4][4];inlinevoid cheng(arr a,arr b){    memset(temp,0,sizeof(temp));    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            for(int k=1;k<=n;k++)            {                temp[i][j]+=a[i][k]*b[k][j];                temp[i][j]%=p;            }        }    }    memcpy(a,temp,sizeof(temp));}void mg(int x){    for(int i=1;i<=n;i++) ans[i][i]=1;    while(x)    {        if(x&1) cheng(ans,a);        x>>=1;        cheng(a,a);    } }main(){    int i,j,k;     n=3;    scanf("%d",&m);    for(i=1;i<=m;i++)    {        memset(ans,0,sizeof(ans));        memset(a,0,sizeof(a));        a[1][1]=1;a[1][2]=1;a[3][1]=1;a[2][3]=1;        scanf("%d",&k);        if(k<=3){            cout<<1<<endl;            continue;        }        mg(k-3);        cout<<(ans[1][1]+ans[3][1]+ans[2][1])%p<<endl;    }}//1 1 1 2 3 4 6 9

长期更新

原创粉丝点击