哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)H-布置会场(II)(矩阵快速幂)

本文介绍了一种利用矩阵快速幂解决大规模斐波那契数列问题的方法,并通过一道具体的编程题来演示实现过程。该方法适用于解决非常大的斐波那契数列项数问题,特别适用于算法竞赛中遇到的类似题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接: https://www.nowcoder.com/acm/contest/27/H
来源:牛客网

题目描述

小d接到了一个布置会场的任务。

他需要将贵宾观众席的椅子排成一排,一共需要N个。

上级领导指示,他只能使用两种椅子。(A类型和B类型)并且假设每种椅子的数量都是无限的。

而其如果想要摆置一个B类型的椅子,对应就需要必须有连续两个一起布置。换句话说,就是如果出现了B类型的椅子,其必须且只有两个连着B类型的椅子。

小d突然想知道对应N个椅子排成一列,他能够有多少种布置的方式.

输入描述:

本题包含多组输入第一行输入一个整数t,表示测试数据的组数
每组测试数据包含一行,输入一个整数N,表示一共需要摆放的椅子数量
t<=1000
1<=N<=100000000000000000(10^18)

输出描述:

每组测试数据输出包含一行,表示一共有多少种布置的方式,方案数可能会很大,输出对1000000007取摸的结果。

题解:
推了几项发现是一个斐波那契数列,但是由于项数太大,要用矩阵快速幂求解。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
struct node
{
    ll a[2][2];
}t,res;
node cheng(node a,node b)
{
    node s;
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
    {
        s.a[i][j]=0;
        for(int k=0;k<2;k++)
        {
            s.a[i][j]+=a.a[i][k]*b.a[k][j];
            s.a[i][j]%=mod;
        }
    }
    return s;
}
void KK(ll b)
{
    while(b)
    {
        if(b&1) t=cheng(t,res);
        res=cheng(res,res);
        b=b/2;
    }
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        ll n;scanf("%lld",&n);
        t.a[0][0]=t.a[1][1]=1;
        t.a[0][1]=t.a[1][0]=0;
        res.a[0][0]=res.a[0][1]=res.a[1][0]=1;
        res.a[1][1]=0;
        KK(n);
        printf("%lld\n",t.a[0][0]%mod);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值