今天带大家推一个简单的矩阵快速幂?教大家推比fbi难一点的矩阵...
首先看a[i][j]=a[i-1][j]+a[i][j-1].其中n行(n<=10)m列(m<=1e9).我们可以观察到n很小对吧.
这个题目是已知矩阵第一行的所有数都长23、233、2333这样.矩阵的第一列已经给出,那么就是看我们如何用第一列推出第m列了?(因为n很大,不可能用n推矩阵.)
好了,我们继续观察递推公式,a[i][j]=a[i-1][j]+a[i][j-1].我们很容易知道,a[i][j]=a[i][0]+a[1~i][j-1].
如此,我们就很容易推出矩阵了.

f[i]={a1,0,a2,0,…,an,0 };
f[i]=f[i-1]*G;
G={
10 10 10 ... 10 10
0   1  1 ...
0   0  1 ...
...
1 1 1  ... 1 1
}

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e7+7;
int n,m;
ll G[12][12];
ll f[12];
void mul1()
{
    ll g[12];
    for(int k=0;k<=n+1;k++) g[k]=f[k];
    memset(f,0,sizeof f);
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
            f[i]=(f[i]+G[j][i]*g[j])%mod;
        }
    }
}

void mul2()
{
    ll G1[12][12],G2[12][12];
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
            G1[i][j]=G2[i][j]=G[i][j]; 
        }
    }
    memset(G,0,sizeof G);
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
            for(int k=0;k<=n+1;k++)
            {
                G[i][j]=(G[i][j]+G1[i][k]*G2[k][j])%mod;
            }
        }
    }
}

void get_ans()
{
    while(m)
    {
        if(m&1) mul1();
        mul2();
        m>>=1;
    }
}

int main()
{
    while(cin>>n>>m)
    {
        memset(G,0,sizeof G);
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                G[i][j]=1;
            }
        }
        for(int i=0;i<=n;i++)   G[0][i]=10;
        for(int i=0;i<=n+1;i++) G[n+1][i]=1;
        f[0]=23;f[n+1]=3;
        for(int i=1;i<=n;i++) cin>>f[i];
        get_ans();
        cout<<f[n]<<endl;
    }
    return 0;
}