zoukankan      html  css  js  c++  java
  • 考研编程练习----递推数列(矩阵相乘法)

    题目描述:

    给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

    输入:

    输入包括5个整数:a0、a1、p、q、k。

    输出:

    第k个数a(k)对10000的模。

    样例输入:
    20 1 1 14 5
    样例输出:
    8359
    经典代码:

    #include <iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int a0,a1,p,q,k;
    struct rec
    {
        int a[2][2];
    };
    rec f(rec aa,rec bb)
    {
        rec ret;
        ret.a[0][0]=(aa.a[0][0]*bb.a[0][0]+aa.a[0][1]*bb.a[1][0])%10000;
        ret.a[0][1]=(aa.a[0][0]*bb.a[0][1]+aa.a[0][1]*bb.a[1][1])%10000;
        ret.a[1][0]=(aa.a[1][0]*bb.a[0][0]+aa.a[1][1]*bb.a[1][0])%10000;
        ret.a[1][1]=(aa.a[1][0]*bb.a[0][1]+aa.a[1][1]*bb.a[1][1])%10000;
        return ret;
    }
    rec mul(rec aa,int  kk)
    {
        rec ret;
        ret.a[0][0]=1;ret.a[0][1]=0;ret.a[1][0]=0;ret.a[1][1]=1;
        for(;kk;kk>>=1)
        {
            if(kk&1)ret=f(ret,aa);
            aa=f(aa,aa);
        }
        return ret;
    }
    int main()
    {
        while(~scanf("%d%d%d%d%d",&a0,&a1,&p,&q,&k))
        {
            if(k==0){printf("%d ",a0);continue;}
            else if(k==1){printf("%d ",a1);continue;}
            rec x;
            x.a[0][0]=p;x.a[0][1]=1;x.a[1][0]=q;x.a[1][1]=0;
            rec ans=mul(x,k-1);
            printf("%d ",(a1*ans.a[0][0]+a0*ans.a[1][0])%10000);
        }
        return 0;
    }
     
  • 相关阅读:
    HNOI2014
    HNOI2018
    HNOI2015
    HNOI2016
    Luogu4099 HEOI2013 SAO 组合、树形DP
    CF915G Coprime Arrays 莫比乌斯反演、差分、前缀和
    CF1110H Modest Substrings AC自动机、DP
    CF1110E Magic Stones 差分
    CentOS 7 配置OpenCL环境(安装NVIDIA cuda sdk、Cmake、Eclipse CDT)
    LeetCode(134) Gas Station
  • 原文地址:https://www.cnblogs.com/Alex0111/p/4632835.html
Copyright © 2011-2022 走看看