0
点赞
收藏
分享

微信扫一扫

HDOJ 233 Matrix(矩阵快速幂)

覃榜言 2022-06-17 阅读 72

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?
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
HDOJ 233 Matrix(矩阵快速幂)_#include
矩阵快速幂的应用主要是通过两个有递推关系的矩阵来构造出要进行幂运算的那个矩阵,在自己n次幂运算后再和题给矩阵相乘吧。
推不出来这个矩阵。。。。。 代码摘自:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MOD 10000007
using namespace std;
typedef long long ll;

struct matrix{
ll a[15][15];
};
int n, m;
matrix mul(matrix x, matrix y)
{
matrix t;
memset(t.a, 0, sizeof(t.a));
for (int i=1; i<=n+2; i++){
for (int j=1; j<=n+2; j++){
for (int k=1; k<=n+2; k++){
t.a[i][j]+=x.a[i][k]*y.a[k][j];
t.a[i][j]%=MOD;
}
}
}
return t;
}

matrix quick_pow(matrix x, int m)
{
matrix ans;
memset(ans.a, 0, sizeof(ans.a));
for (int i=1; i<=n+2; i++){
ans.a[i][i]=1;
}
while (m){
if (m&1)
ans=mul(ans, x);
x=mul(x, x);
m>>=1;
}
return ans;
}

int main()
{
while (scanf("%d%d", &n, &m)!=EOF){
matrix A, B;
memset(A.a, 0, sizeof(A.a));
memset(B.a, 0, sizeof(B.a));
A.a[1][1]=23;
for (int i=1; i<=n; i++)
scanf("%d", &A.a[i+1][1]);
A.a[n+2][1]=3;

for (int i=1; i<=n+1; i++)
B.a[i][1]=10;
for (int i=1; i<=n+2; i++)
B.a[i][n+2]=1;
for (int i=1; i<n+2; i++)
for (int j=2; j<=i; j++)
B.a[i][j]=1;

B=quick_pow(B, m);
A=mul(B, A);
printf("%lld\n", A.a[n+1][1]);
}
return 0;
}


举报

相关推荐

0 条评论