OJ_1081 递推数列

#include <iostream>
using namespace std;
const int N=10000;
int matrix[2][2];
 int middle[2][2];
void multiMatrix(int a[2][2], int b[2][2], int c[2][2])
{
    int i, j, d[2][2];
 
    d[0][0] = (a[0][0] * b[0][0] + a[0][1] * b[1][0]) % N;
    d[0][1] = (a[0][0] * b[0][1] + a[0][1] * b[1][1]) % N;
    d[1][0] = (a[1][0] * b[0][0] + a[1][1] * b[1][0]) % N;
    d[1][1] = (a[1][0] * b[0][1] + a[1][1] * b[1][1]) % N;
 
    for (i = 0; i < 2; i ++) {
        for (j = 0; j < 2; j ++) {
            c[i][j] = d[i][j];
        }
    }
}
 
void getresult(int n)
{
    middle[0][0] = middle[1][1] = 1;
    middle[0][1] = middle[1][0] = 0;
 
    while (n) {
        if (n & 1) {
            multiMatrix(middle, matrix, middle);
        }
        multiMatrix(matrix, matrix, matrix);
 
        n >>= 1;
    }
}
void func()
{
     int a0,a1,p,q,k;
     while(cin>>a0>>a1>>p>>q>>k)
     {
           if(k==0)
           cout<<a0%N<<endl;
           else if(k==1)
           cout<<a1%N<<endl;
           else
           {
               matrix[0][0] = p; matrix[0][1] = q;
              
               matrix[1][0] = 1;matrix[1][1] = 0;
               
               getresult(k-1);
               int result=(middle[0][0] * a1 + middle[0][1] * a0) % N; 
               cout<<result<<endl;
               
           }
     }
     
}
int main(int argc, char *argv[])
{
    
	//printf("Hello, world\n");
	func();
	return 0;
}

矩阵乘法

题目描述:

给定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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值