今天带大家推一个简单的矩阵快速幂?教大家推比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;
}
京公网安备 11010502036488号