题目描述
存在如下递推式:
F(n+1)=A1*F(n)+A2*F(n-1)+...+An*F(1)
求第K项的值对1000000007取模的结果
输入
单组测试数据
第一行输入两个整数 n , k (1<=n<=100,n<k<=10000000000)
第二行输入 n 个整数 F(1) F(2) ... F(n)
第三行输入 n 个整数A1 A2 ... An
输出
输出一个整数
样例输入
2 3
1 2
3 4
样例输出
10
思路:利用递推式构造矩阵,利用矩阵快速幂求解即可;
时间复杂度:O(n^3*logk)
代码:
#include<cmath>
#include<vector>
#include<iostream>
#include <cstdio>
using namespace std;
const int INF=1<<30;
const int MAXN=510;
typedef long long LL;
int n,m;
int f[510];
LL k;
//用二维vector来表示矩阵
typedef vector<int> vec;
typedef vector<vec> mat;
const int MOD = 1000000007;
//计算A*B
mat mul(mat &A,mat &B)//返回mat类型;
{
mat C(A.size(),vec(B[0].size()));//临时二维vector,自动初始化为0,,数组形式不是全局变量要初始化memset;
for(int i=0;i<A.size();i++)
for(int k=0;k<B.size();k++)
if(A[i][k]!=0)//对于矩阵较多0;
for(int j=0;j<B[0].size();j++)
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;
return C;
}
//计算A^n
mat pow(mat A,LL n)//返回mat类型;
{
mat B(A.size(),vec(A[0].size()));//临时二维vector;
for(int i=0;i<A.size();i++)
B[i][i]=1;
while(n>0)//快速幂
{
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main(){
//freopen("in.txt","r",stdin);
cin>>n>>k;
k=k-n;
for(int i=0;i<n;i++){
cin>>f[n-i-1];
}
mat A(n,vec(n));
for(int i=0;i<n;i++){
cin>>A[0][i];
}
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
A[i][j]=0;
}
A[i][i-1]=1;
}
A=pow(A,k);
LL ans=0;
for(int i=0;i<n;i++){
ans=(ans+A[0][i]*f[i])%MOD;
}
cout<<ans<<endl;
return 0;
}