题干:
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333... (it means a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333...) Besides, in 233 matrix, we got ai,j = a i-1,j +a i,j-1( i,j ≠ 0). Now you have known a 1,0,a 2,0,...,a n,0, could you tell me a n,m in the 233 matrix?
Input
There are multiple test cases. Please process till EOF.
For each case, the first line contains two postive integers n,m(n ≤ 10,m ≤ 10 9). The second line contains n integers, a 1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).
Output
For each case, output a n,m mod 10000007.
Sample Input
1 1
1
2 2
0 0
3 7
23 47 16
Sample Output
234
2799
72937
Hint
结题报告:
依旧是按照列,找一个转移矩阵,然后做运算,最后乘上之前保存的数组,得到想要的结果
AC代码:
#include<bits/stdc++.h>using namespace std;
const int MAX = 20 ;
const int mod = 10000007 ;
struct Matrix {long long mat[MAX][MAX];
};
int n,m;
long long b[MAX];
Matrix mul(Matrix a,Matrix b)
{Matrix c;memset(c.mat,0,sizeof(c.mat));for(int i=0; i<=n+1; i++) {for(int j=0; j<=n+1; j++) {c.mat[i][j]=0;for(int k=0; k<=n+1; k++) {if(a.mat[i][k]&&b.mat[k][j]) {c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];//矩阵乘法c.mat[i][j]%=mod;}}}}return c;//返回乘完了之后的矩阵
}
Matrix q_pow(Matrix a, int k)
{Matrix ans;memset(ans.mat,0,sizeof(ans.mat));for(int i=0;i<=n+1;i++)ans.mat[i][i]=1;while(k)//使用快速幂的思想进行矩阵的m次方相乘{if(k&1) {ans=mul(ans,a);}k>>=1;a=mul(a,a);}return ans;
}int main()
{int m;Matrix a;//转移矩阵 while(~scanf("%d%d",&n,&m) ){//初始化第一列 //b数组就是第一列,最后与转移矩阵的m次方相乘得到anmfor(int i=1; i<=n; i++) {scanf("%lld",&b[i]);}b[0]=23;b[n+1]=3;//求a这个转移矩阵。先初始化!因为你比如a13 这个地方的值就没有更新到,因为他是0,所以运算之后就可能改变值了,所以下一组输入的时候a13这里就不是0了,所以这里一定要memset一下。 memset(a.mat,0,sizeof(a.mat));for(int i = 0; i<=n; i++) {a.mat[i][0]=10;a.mat[i][n+1]=1;}a.mat[n+1][n+1]=1;for(int i = 1; i<=n; i++) {for(int j = 1; j<=i; j++) {a.mat[i][j]=1;}}Matrix end = q_pow(a,m);long long ans=0;for(int i = 0;i<=n+1;i++) {ans+=(end.mat[n][i]*b[i])%mod,ans%=mod;}printf("%lld\n",ans);}return 0;
}