矩阵快速幂 牛客网哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)H题

本文介绍了一个有趣的排列问题:如何计算用两种类型的贵宾椅(A型和B型,其中B型必须连续放置两次)组成特定长度排列的方法总数。文章提供了两种算法实现思路:快速幂和矩阵快速幂,并附带了相应的C++代码。

摘要生成于 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;
int quickpow(int a,int b)
{
    int r=1;
    while(b)
    {
        if(b%2)r=r*a%mod;
        a=a*a%mod;
        b=b/2;
    }
    return r;
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        cout<<quickpow(a,b)<<endl;
    }
    return 0;
}

矩阵快速幂

#include <bits/stdc++.h>
using namespace std;
const int maxn=1000000007;
struct node
{
    long long a[2][2];
};
node matrix(node x,node y)
{
    node r;
    memset(r.a,0,sizeof(r.a));
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<2;k++)
            {
                r.a[i][j]+=x.a[i][k]*y.a[k][j];
                r.a[i][j]%=maxn;
            }
        }
    }
    return r;
}
long long quickpow(long long n)
{
    node c,r;
    memset(r.a,0,sizeof(r.a));
    c.a[0][0]=c.a[0][1]=c.a[1][0]=1;
    c.a[1][1]=0;
    r.a[0][0]=r.a[0][1]=1;
    while(n)
    {
        if(n%2) r=matrix(c,r);
        c=matrix(c,c);
        n/=2;
    }
    return r.a[0][1];
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        long long k;
        scanf("%lld",&k);
        cout<<quickpow(k)<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值