所以这是他们问我的问题:
随机数生成是生成一系列数字或 与随机相比,无法合理预测的符号 机会。假设我们使用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;
}
答案 0 :(得分:0)
你使用递归的Fibonacci,很可能是大n
的溢出堆栈导致Segmentation fault
错误。
不知道矩阵乘法与问题的其余部分有什么关系。