参看资料:
https://blog.csdn.net/wust_zzwh/article/details/52058209
http://www.cnblogs.com/whatbeg/p/3971994.html
题目:
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
题目大意:
一个矩阵 a ,第一行 依次 是 0 , 233 , 2333 , 23333......;
给出矩阵的递推式:a [ i ] [ j ] = a [ i - 1 ] [ j ] + a [ i ] [ j -1 ] ,输入的是第零列,求 a [ n ] [ m ] ,n ≤ 10,m ≤ 10^9 ;
解题思路:
扣扣索索试了几组数据,画了几张纸,对于各个点,都递推到边界-第0行/第0列 上来,总感觉又规律,又找不出。。
直到看见这样一张图:
即:红色部分为绿色部分之和,而最上面的绿色部分很好求(233..的递推),左边的绿色部分(最多10个)其实就是:A[1][m-1],A[2][m-1]..A[n][m-1],即对每个1<=i<=n, A[i][m]都可由A[1][m-1],A[2][m-1]..A[n][m-1],于是建立12*12的矩阵:
实现代码:
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10000007
#define ll __int64
using namespace std;
struct Node{
ll mat[15][15];
Node(){
memset(mat,0,sizeof(mat));
}
};
ll n;
Node mul(Node A,Node B){
Node C;
for(int i=1;i<=n+2;i++){
for(int j=1;j<=n+2;j++){
for(int k=1;k<=n+2;k++){
C.mat[i][j]=(C.mat[i][j]+A.mat[i][k]*B.mat[k][j]%mod+mod)%mod;
}
}
}
return C;
}
Node Pow(Node A,int k){
Node B;
for(int i=1;i<=n+2;i++)
B.mat[i][i]=1;
while(k>=1){
if(k&1)
B=mul(B,A);
A=mul(A,A);
k=k/2;
}
return B;
}
int main(){
int m;
while(~scanf("%d%d",&n,&m)){
Node A,B;
A.mat[1][1]=23;
for(int i=1;i<=n;i++)
scanf("%d",&A.mat[i+1][1]);
A.mat[n+2][1]=3;
for(int i=1;i<=n+1;i++)
B.mat[i][1]=10;
for(int i=1;i<=n+2;i++)
B.mat[i][n+2]=1;
for(int i=2;i<=n+1;i++)
for(int j=2;j<=i;j++)
B.mat[i][j]=1;
B=Pow(B,m);
A=mul(B,A);
cout<<A.mat[n+1][1]<<endl;
}
return 0;
}