第四届“图灵杯”NEUQ-ACM程序设计竞赛(团队赛)-网络同步赛F(矩阵快速幂)

问题 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值