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 a i,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?
输入
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, a1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).
输出
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, a1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).
输入样例
1 1
1
2 2
0 0
3 7
23 47 16
输出样例
234
2799
72937
--------------------------------------------------------------------------------------------------
思路
1, f(n,m) = f(n, m-1)*10+3;
2, f(n,m) = f(n-1,m)+f(n,m-1)
= f(n,m-1)+f(n-1,m-1)+f(n-2,m-1)+...+f(1,m-1)+f(0,m-1)*10+3;(数学归纳法)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef long long ll;
#define mod 10000007
struct node
{
ll a[13][13];
};
node multi(node a, node b)//矩阵相乘
{
node c = {0};
for(int i=0;i<13;i++)
{
for(int j=0;j<13;j++)
{
for(int k=0;k<13;k++)
{
c.a[i][j] = (c.a[i][j] + (a.a[i][k] * b.a[k][j]))%mod;
}
}
}
return c;
}
node pow_mod(node a, ll n)//矩阵快速幂
{
node b = {0};
for(int i=0;i<13;i++)
{
b.a[i][i] = 1;//单位矩阵
}
while(n)
{
if(n&1) b = multi(a,b);
a = multi(a, a);
n>>=1;
}
return b;
}
int main()
{
ll n, m;
while(~scanf("%lld %lld", &n, &m))
{
node a={0}, b={0};
for(int i=1;i<=n;i++)
{
scanf("%lld", &b.a[i][0]);
}
b.a[0][0] = 23;
b.a[n+1][0] = 3;
for(int i=0;i<=n;i++)
{
a.a[i][0] = 10;
a.a[i][n+1] = 1;
for(int j=1;j<=i;j++)
{
a.a[i][j] = 1;
}
}
a.a[n+1][n+1] = 1;
printf("%lld\n",multi(pow_mod(a,m),b).a[n][0]);
}
return 0;
}