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;
    }
     
  • 相关阅读:
    前端页面弹框遮罩禁止页面滚动
    微信浏览器兼容问题
    判断是否为空对象的方法
    reflow和repaint理解总结
    45道CSS基础面试题(附答案)
    iframe跨域修改子页面内容或样式
    日期中前一天和后一天
    js事件绑定方法
    C#常用的数据格式转换
    C#代码和javascript函数相互调用
  • 原文地址:https://www.cnblogs.com/Alex0111/p/4632835.html
Copyright © 2011-2022 走看看