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;
    }
     
  • 相关阅读:
    log4j(七)——log4j.xml简单配置样例说明
    log4j(六)——log4j.properties简单配置样例说明
    三元运算符注意事项
    单精度浮点数操作
    反转链表算法Java实现
    VBS计时器2
    肖申克的救赎影评
    计算机中K到底是1000还是1024?
    二进制补码除法——计算机底层整数除法模拟之Java实现
    VBS计时器
  • 原文地址:https://www.cnblogs.com/Alex0111/p/4632835.html
Copyright © 2011-2022 走看看