矩阵乘

来源:互联网 发布:什么叫大数据云计算 编辑:程序博客网 时间:2024/04/25 19:00

一年前这个时候学的矩阵乘法, 但是当时好像就没怎么懂, 前天碰到了这种题果然还是不会做, ,,多做几道练习吧。

求K位的相邻两位之差不大于2的题。

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#define mod 1000000007using namespace std;long long k;inline void cheng(int a[11][11], int b[11][11]){    int c[11][11] = {0};    for(int i = 0; i < 10; i ++)        for(int j = 0; j < 10; j ++)            for(int k = 0; k < 10; k ++)                c[i][j] = ((long long)a[i][k] * b[k][j] + c[i][j]) % mod;    for(int i = 0; i < 10; i ++)        for(int j = 0; j < 10; j ++)            a[i][j] = c[i][j];  }int a[11][11], b[11][11], ans;int main(){    freopen("sam.in", "r", stdin);    freopen("sam.out", "w", stdout);    scanf("%I64d", &k);    long long n = k;    if(n == 1){puts("10"); return 0;}    for(int i = 0; i < 10; i ++)a[i][i] = 1;    for(int i = 0; i < 10; i ++){        for(int j = 0; j < 10; j ++)            if(abs(j - i) <= 2)                b[i][j] = 1;        }    n--;    while(n){        if(n & 1)cheng(a, b);        n = n >> 1;        cheng(b, b);        }    for(int j = 1; j < 10; j ++)        for(int k = 0; k < 10; k ++)            ans= (ans + a[k][j]) % mod;    cout<<ans<<endl;   // system("pause");    return 0;}
然后做了noi2012随机数生成器

这个只是一个简单的两位的矩阵但是两个longlong乘起来会爆, 所以还需要用快速乘, 以前没写过快速乘, 不过还是很好写的, 就是和快速幂一样的思想, 从乘2到乘4再到乘8这样注意地把一个乘数分解就好了。但是我做这道题的时候还是不能自己构建出矩阵。。

0 0