51 nod 1126 求递推序列的第N项 矩阵快速幂

本文介绍了一道编程题的解决思路,该题目要求使用矩阵快速幂的方法来计算一个特殊的斐波那契数列变种。通过定义特定的矩阵并运用快速幂算法,可以有效地计算出给定参数A、B、N下F[N]的值。

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126
题意:有下面这个式子:F1=1,F2=1.F[n]=(A*F[n-1]+B*F[n-2])%7 (n>=3) .
求给定A,B,N,求F[N].
智障一样的找了一个小时:1.矩阵式n-2次方,2,F1=1,不是等于0啊。

#include<cstdio>
#include<queue>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<set>
#include<stack>
#include<algorithm>
#define cle(a) memset(a,0,sizeof(a))
#define inf(a) memset(a,0x3f,sizeof(a))
#define ll long long
#define Rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int INF = ( 2e9 ) + 2;
const int mod = 7;
int c[2][2];
void mul(int e[][2],int a[][2],int b[][2])
{
    int t[2][2];
    memset(t,0,sizeof(t));
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    for(int k=0;k<2;k++)
    t[i][j]=(t[i][j]+((a[i][k]*b[k][j])%mod+mod)%mod)%mod;
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    e[i][j]=t[i][j];
    return;
}
void qPow(int n)
{
    int ret[2][2];
    memset(ret,0,sizeof(ret));
    for(int i=0;i<2;i++)ret[i][i]=1;
    while(n)
    {
        if(n&1)
        mul(ret,ret,c);
        mul(c,c,c);
        n>>=1;
    }
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    c[i][j]=ret[i][j];
}
int main()
{
    int a,b,n;
//  freopen("in.txt","r",stdin);
    scanf("%d%d%d",&a,&b,&n);
    c[0][0]=0;
    c[0][1]=1;
    c[1][0]=b;
    c[1][1]=a;
    qPow(n-2);

    printf("%d\n",(c[1][1]+c[1][0])%mod);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值