具有矩阵乘法的滞后Fibonacci随机数发生器

时间:2018-03-13 05:52:52

标签: c++ matrix-multiplication fibonacci

所以这是他们问我的问题:

  

随机数生成是生成一系列数字或   与随机相比,无法合理预测的符号   机会。假设我们使用Fibonacci数作为序列并使用   modula m作为随机数。请写一个程序来计算   生成的号码。输入包含几个测试用例。每个测试用例   由两个整数n(0 <= n <= 2,000,000,000)和m(2 <= m <=   30,000)。测试将在文件结束时停止。对于每个测试用例,输出   生成的数字(Fib(n)%m)。

     

输入:1 10 2 10 3 10 4 10 5 10 6 10 7 10

     

输出:1 2 3 5 8 3 1

我的代码如下所示:

#include <iostream>
#include <stdio.h>
using namespace std;
int fibo(int n) {
    if (n==0)
        return 1;
    else if (n==1)
        return 1;
    else
        return fibo(n-1) + fibo(n-2);
}
int main(){
int n;
int m;
while (cin>>n){
if (n>2000000000||n<0)
    break;
else cin>>m;
if (m>30000||m<2)
    break;
else cout<<(fibo(n)% m)<<endl;
}
return 0;}

它有效,但我在网上判断中不断出现这个错误:

  

运行时错误:分段错误

不知怎的,我得到了'#34;对&#34;回答法官接受的那个。它使用矩阵乘法,这是他们所期待的?

#include<iostream>
using namespace std;

    int n,m;

    bool input(){
        if(!(cin >> n))
            return false;
        cin >> m;
        return true;
    }

    struct Matrix {
        int data[2][2];
    };

    Matrix Mult(const Matrix &a, const Matrix &b) {
        Matrix c;
        // Martices multiplication
        c.data[0][0]=a.data[0][0]*b.data[0][0]+a.data[0][1]*b.data[1][0];
        c.data[0][1]=a.data[0][0]*b.data[0][1]+a.data[0][1]*b.data[1][1];
        c.data[1][0]=a.data[1][0]*b.data[0][0]+a.data[1][1]*b.data[1][0];
        c.data[1][1]=a.data[1][0]*b.data[0][1]+a.data[1][1]*b.data[1][1];
        c.data[0][0]=c.data[0][0]%m;c.data[0][1]=c.data[0][1]%m;
        c.data[1][0]=c.data[1][0]%m;c.data[1][1]=c.data[1][1]%m;
        return c;
    }

    Matrix Pow(const Matrix base, int exp) {
        if (exp == 0) return base;
        if (exp == 1) return base;
        Matrix sq = Mult(base, base);
        if (exp % 2 == 0)
            return Pow(sq, exp/2);
        else
            return Mult(base, Pow(sq, exp/2));
    }

    int main(){
        while(input()){
            struct Matrix bic;
            bic.data[0][0]=1;bic.data[0][1]=1;
            bic.data[1][0]=1;bic.data[1][1]=0;
            Matrix ans = Pow(bic, n);
            cout<<ans.data[0][0]<<endl;
        }
        return 0;
    }

1 个答案:

答案 0 :(得分:0)

你使用递归的Fibonacci,很可能是大n的溢出堆栈导致Segmentation fault错误。

不知道矩阵乘法与问题的其余部分有什么关系。