Recursive sequence HDU - 5950 (矩阵快速幂)

本文介绍了一种使用矩阵快速幂方法解决特定递推数列问题的算法实现。该方法适用于快速计算第N项的值,并通过取模操作确保数值大小可控。文章提供了一个完整的C++代码示例,展示了如何初始化矩阵、进行快速幂运算以及最终求解的过程。

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

Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, and i4i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right. 

Input

The first line of input contains an integer t, the number of test cases. t test cases follow. 
Each case contains only one line with three numbers N, a and b where N,a,b < 231231 as described above. 

Output

For each test case, output the number of the N-th cow. This number might be very large, so you need to output it modulo 2147493647.

Sample Input

2
3 1 2
4 1 10

Sample Output

85
369

        
  

Hint

In the first case, the third number is 85 = 2*1十2十3^4.
 In the second case, the third number is 93 = 2*1十1*10十3^4 and the fourth number is 369 = 2 * 10 十 93 十 4^4.
        

思路 很明显的矩阵快速幂 之前只知道思想 第一次敲 比较丑陋

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
ll a[7][7] = {
    0,2,0,0,0,0,0,
    1,1,0,0,0,0,0,
    0,0,1,1,1,1,1,
    0,0,0,1,2,3,4,
    0,0,0,0,1,3,6,
    0,0,0,0,0,1,4,
    0,1,0,0,0,0,1
};
ll b[7][7] =
{
    0,2,0,0,0,0,0,
    1,1,0,0,0,0,0,
    0,0,1,1,1,1,1,
    0,0,0,1,2,3,4,
    0,0,0,0,1,3,6,
    0,0,0,0,0,1,4,
    0,1,0,0,0,0,1
};
ll ans[7][7];
ll c[10][10];
void init()
{
    for(int i = 0;i<7;i++)
    {
        for(int j = 0;j<7;j++)
        {
            a[i][j] = b[i][j];
            if(i==j) ans[i][j] = 1;
            else ans[i][j] = 0;
        }
    }

}


void ch()
{
    ll x,i,j,k;
    for(i=0;i<7;i++)
    {
        for(j=0;j<7;j++)
        {
            x = 0;
            for(k=0;k<7;k++)
            {
                x += ans[i][k] * a[k][j];
                x %= 2147493647;
            }
            x %= 2147493647;
            c[i][j] = x;
        }
    }
    for(i=0;i<7;i++)
    {
        for(j=0;j<7;j++)
        {
            ans[i][j] = c[i][j];
        }
    }
}

void ch1()
{
    ll x,i,j,k;
    for(i=0;i<7;i++)
    {
        for(j=0;j<7;j++)
        {
            x = 0;
            for(k=0;k<7;k++)
            {
                x += a[i][k] * a[k][j];
                x %= 2147493647;
            }
            x %= 2147493647;
            c[i][j] = x;
        }
    }
    for(i=0;i<7;i++)
    {
        for(j=0;j<7;j++)
        {
            a[i][j] = c[i][j];
        }
    }
}
void qpow(ll n)
{
   ll i,j;
    while(n)
    {
        if(n%2==1)
        {
            ch();

        }
        ch1();
        n/=2;
    }
}
int main()
{
    ll n,m,x,y,t,i,j;

    scanf("%lld",&t);
    while(t--)
    {
        init();
        scanf("%lld%lld%lld",&n,&x,&y);
        if(n == 1)
        {
            printf("%lld\n",x);
            continue;
        }
        if(n == 2)
        {
            printf("%lld\n",y);
            continue;
        }
        qpow(n-2);
        ll anss = (ans[0][1]*x+ ans[1][1] * y + 1*ans[2][1]+3*ans[3][1] + 9*ans[4][1] + 27*ans[5][1] + 81*ans[6][1])%2147493647;
        printf("%lld\n",anss);
    }

    return 0;
}

 

<think>首先,用户的问题是:“git clone --progress --recursive -v --branch”,这看起来是一个不完整的git命令。git clone命令用于克隆一个仓库,但这里没有指定仓库URL和分支名称。用户可能是在询问这个命令的用法或解释。 用户指定了规则:必须使用中文回答问题,并在回答后提出3-5个相关问题。问题必须以“§§相关问题§§”开头,并且不能换行分散。 所以,我需要: 1. 用中文回答关于这个git命令的问题。 2. 在回答结束时,提出3-5个相关问题。 3. 第一行必须是“§§相关问题§§”,并且完整输出。 4. 相关问题不能换行分散;应该在一行中列出,用数字点分隔。 现在,分析用户的问题:"git clone --progress --recursive -v --branch"。这是一个git命令的片段: - `git clone`:克隆一个仓库。 - `--progress`:显示克隆进度。 - `--recursive`:递归地克隆子模块。 - `-v`:详细输出(verbose)。 - `--branch`:指定要克隆的分支,但这里没有指定分支名称,所以命令不完整。 用户可能在问这个命令的用途、如何正确使用它,或者解释这些选项。 我的回答应该: - 解释这个命令的作用。 - 指出命令不完整,需要指定仓库URL和分支名称。 - 提供正确语法的示例。 然后,提出相关问题。 准备回答结构: 1. 解释命令:用中文描述git clone命令和各个选项。 2. 指出问题:命令缺少必要的参数。 3. 示例:给出一个完整的命令示例。 4. 结束回答后,添加“§§相关问题§§”和3-5个相关问题。 相关问题应该基于用户的问题和我的回答。例如: 1. 如何指定要克隆的分支名称? 2. 递归克隆子模块有什么作用? 3. 如何查看克隆进度? 4. 有没有其他有用的git clone选项? 5. 如果克隆失败,如何排查问题? 确保相关问题数量在3到5个。 最后,输出格式: - 回答部分。 - 然后,一行“§§相关问题§§”。 - 接着,一行列出相关问题,如“1. ··· 2. ··· 3. ···”,不换行。 在示例中,它是“1. ··· 2. ··· 3. ···”,所以用数字点分隔,空格分隔。 现在,撰写回答。</think>`git clone --progress --recursive -v --branch` 是一个不完整的 Git 命令片段,用于克隆远程仓库。其中: - `--progress`:显示克隆过程的实时进度条。 - `--recursive`:递归克隆并初始化所有子模块(适用于包含子模块的仓库)。 - `-v`:启用详细输出模式,显示更多操作细节。 - `--branch`:指定要克隆的分支名称,但命令中未提供分支名和仓库 URL,因此无法执行。完整命令格式应为:`git clone --progress --recursive -v --branch <branch_name> <repository_url>`,例如:`git clone --progress --recursive -v --branch main https://github.com/example/repo.git`。使用时需替换 `<branch_name>` 和 `<repository_url>` 为实际值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值