AcWing 226. 233矩阵

 

a_{i, j}= \sum_{k=1}^{i}a_{k, j- 1}+a_{0, j} ,并且a_{0,. j}=a_{0, j - 1} * 10 + 3,所以a_{i, j}= \sum_{k=1}^{i}a_{k, j- 1}+a_{0, j-1} * 10 + 3.

F(0)=[a_{0, 0}, a_{1, 0}, a_{2, 0}, ...a_{n, 0}, 3], 其中,我们假设a_{0, 0}=23,方便递推

设转移矩阵G,有F(m)=F(0)*G^m.

代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 15, mod = 10000007;
int F[N], G[N][N];
int n, m;
void mul(int a[N], int b[N][N]){
    int ans[N] = {0};
    for (int i = 0; i <= n + 1; ++i)
        for (int k = 0; k <= n + 1; ++k)
             ans[i] = (ans[i] + a[k] * b[k][i]) % mod;
    memcpy(a, ans, sizeof ans);
}
void mulslf(int a[N][N], int b[N][N]){
    int ans[N][N] = {0};
    for (int i = 0; i <= n + 1; ++i)
        for (int j = 0; j <= n + 1; ++j)
            for(int k = 0; k <= n + 1; ++k)
                ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % mod;
    memcpy(a, ans, sizeof ans);
}
signed main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    while (cin >> n >> m){
        memset(F, 0, sizeof F);
        memset(G, 0, sizeof G);
        //F是状态矩阵.初始化为F[23, a[1,0], a[2,0],...a[n,0], 3]
        for (int i = 1; i <= n; ++i)
            cin >> F[i];
        F[0] = 23, F[n + 1] = 3;
        //G是转移矩阵.
        for (int i = 0; i <= n; ++i){
            G[0][i] = 10;
            G[n + 1][i] = 1;
        }
        G[n + 1][n + 1] = 1;
        for (int i = 1; i <= n; ++i)
            for (int j = i; j <= n; ++j)
                G[i][j] = 1;
        while (m){
            if (m & 1)
                mul(F, G);
            m >>= 1;
            mulslf(G, G);
        }
        cout << F[n] << "\n";
    }
}

总结:

1.a_{i, j} = a_{i - 1, j} + a_{i, j - 1}的转化.

2.如果出现多余的列时,不要初始化为0,要按照单位矩阵的形式进行初始化.
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值