zoukankan      html  css  js  c++  java
  • 矩阵乘法+快速幂+序列递推公式

    1250: Gobonacci

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 75  解决: 11
    [提交][状态][讨论版]

    题目描述

          Fibonacci sequence is well-known to us ,f(0)=1,f(1)=1, f(n) = f(n-1)+f(n-2), how nice the recursion! In addition, the is exponential growth in series. Obviously, Goagain was not content with the fact that the series didn’t increased as rapidly as he had expected, therefore, he designed such a function

    g(0) = a   g(1)= b    g(2)=c

    g(n)=3*g(n-1)+2*g(n-2)+g(n-3)      (n>=2)

         Besides, the function was named after Goagain series. What made him distracted was that he could hardly calculate the series.

         By the way , goagain without any festival fuck named it Gobonacci sequence

    输入

    Multiple sets of input data, each set including four positive integers a, b, c ,n  ( a, b, c <= 100 , 0<=  n <2^60)

    输出

    Please output the value of g(n), considering the value of g(n) is far too large, output g(n) %100000007  is okay.

    样例输入

    1 1 1 33 2 1 3

    样例输出

    610
    
    
    
    
    #include<iostream>
    using namespace std;
    struct m{long long  int a[3][3]; };
    long long int big = 100000007;
    m aa = { 0, 1, 0, 0, 0, 1, 1, 2, 3 };
    m mul(m a, m b){
    	int i, j, k;
    	m c;
    	for (i = 0; i < 3;i++)
    	for (j = 0; j < 3; j++)
    	{
    		c.a[i][j] = 0;
    		for (k = 0; k < 3; k++)
    			c.a[i][j] +=( (a.a[i][k]%big) * (b.a[k][j]%big))%big;
    		c.a[i][j] %= big;
    	}
    	return c;
    }
    m power(m a, long long int n){
    	if (n == 1)return a;
    	m b = power(a, n / 2);
    	m c = mul(b, b);
    	if (n % 2 == 1)c = mul(a, c);
    	return c;
    }
    int main(){
    	freopen("in.txt", "r", stdin);
    	long long int a, b, c, n;
    	while (cin >> a >> b >> c >> n){
    		if (n == 0){ cout << a << endl; continue; }
    		if (n == 1){ cout << b << endl; continue; }
    		if (n == 2){ cout << c << endl; continue; }
    		m ans = power(aa, n-2);
    		cout << (ans.a[2][0] * a + ans.a[2][1] * b + ans.a[2][2] * c) % big << endl;
    	}
    }


  • 相关阅读:
    栈——有效括号问题
    链表——判断是否有环,如果有,找到入口节点并返回(转自leetcode,个人留存)
    链表—判断是否有环
    链表—判断是否有环
    链表成对反转
    反转链表
    __attribute__机制
    linux write()
    错题本本-20180919
    C++ 11特性
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/5013903.html
Copyright © 2011-2022 走看看