问题 F: 一道简单的递推题
时间限制: 1 Sec 内存限制: 128 MB
提交: 532 解决: 45
[提交][状态][讨论版]
题目描述
存在如下递推式:
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
题解:
递推式已经给出,构建矩阵,
{fn,fn-1,fn-2,,,,,F1}和
{A1,1,0,0,0……}
{A2,0,1,0,0,0…}
{A3,0,0,1,0,0…}
……
{AN,0,0……1.0};
套一个矩阵快速幂即可。
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<string.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const int mod=1000000007;
int n;
ll k;
struct Matrix
{
ll m[101][101];
};
Matrix Mul(Matrix a,Matrix b)
{
Matrix c;
memset(c.m,0,sizeof(c.m));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
for(int k=0; k<n; k++)
{
if(a.m[i][k]==0||b.m[k][j]==0) continue;
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]+mod)%mod;
}
return c;
}
Matrix fastm(Matrix res, Matrix a,ll n)
{
while(n)
{
if(n&1)
res = Mul(res,a);
n>>=1;
a = Mul(a,a);
}
return res;
}
Matrix init()
{
Matrix pp;
memset(pp.m,0,sizeof(pp.m));
for(int i=0;i<n;i++)
{
scanf("%lld",&pp.m[i][0]);
}
for(int i=1;i<n;i++)
{
pp.m[i-1][i]=1;
}
return pp;
}
int main()
{
scanf("%d%lld",&n,&k);
Matrix res;
memset(res.m,0,sizeof(res.m));
for(int i=1;i<=n;i++)
{
scanf("%lld",&res.m[0][n-i]);
}
Matrix p=fastm(res,init(),k-n);
ll cnt=p.m[0][0];
printf("%lld\n",cnt%mod);
}