Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求递推关系的第n项,给定前2项f(0)和f(1)_Java_C++_C++11_Recursion_Recurrence - Fatal编程技术网

Java 求递推关系的第n项,给定前2项f(0)和f(1)

Java 求递推关系的第n项,给定前2项f(0)和f(1),java,c++,c++11,recursion,recurrence,Java,C++,C++11,Recursion,Recurrence,f(n)=f(n-1)+f(n-2)+f(n-1)*f(n-2) 1只要您没有提供代码示例,我就给您一个大概的想法 就我个人而言,我不会使用递归,因为n可能会很大,从而导致效率低下、计算时间长、填充堆栈并导致溢出。所以最好使用数组输入一个循环 下一个技巧是保持数字相对较小,计算每一步的模(a+b+ab)%m等于(a%m+b%m+(a%m)*(b%m))%m(请参阅),因此我们将数字保持在0..10^9 以下是解决方案的一个示例: const unsigned int mod = 1e9+7; s

f(n)=f(n-1)+f(n-2)+f(n-1)*f(n-2)


1只要您没有提供代码示例,我就给您一个大概的想法

就我个人而言,我不会使用递归,因为
n
可能会很大,从而导致效率低下、计算时间长、填充堆栈并导致溢出。所以最好使用数组输入一个循环

下一个技巧是保持数字相对较小,计算每一步的模
(a+b+ab)%m
等于
(a%m+b%m+(a%m)*(b%m))%m
(请参阅),因此我们将数字保持在
0..10^9

以下是解决方案的一个示例:

const unsigned int mod = 1e9+7;
std::vector<unsigned int> vec(n+1);    // prepare vector of needed size
                                       // size is n+1 because we start from 0 and you need vec[n]
vec[0] = 1;                            
vec[1] = 1e9;

unsigned long long int r1, r2;         // long long will prevent r1*r2 from overflowing
for (unsigned int i = 2; i <= n; ++i)
{
    r1 = vec[i-1] % mod;
    r2 = vec[i-2] % mod;
    vec[i] = (r1 + r2 + r1*r2) % mod;
}

std::cout << vec[n];
const unsigned int mod=1e9+7;
向量向量向量(n+1);//准备所需大小的载体
//大小为n+1,因为我们从0开始,您需要向量[n]
vec[0]=1;
vec[1]=1e9;
无符号长整型r1,r2;//long long将防止r1*r2溢出

for(unsigned int i=2;ik=100000007是素数。因此
a^b mod k
相当于
a^(b mod(k-1))

模k,f(0)+1是2,f(1)+1是-6

通过重复平方和选择要相乘的平方,可以有效地将事物提升到幂次方

计算第n个Fibbonacci mod 100000006是一件棘手的事情(对于大n)。我不知道有一个简单的封闭形式

啊哈!Pisano周期是Fibbonacci数mod some value repeat.k分解为素数2*500000003的周期

简单地计算2和500000003的值。取这两个素数的pisano周期的LCM,得到它们乘积的pisano周期。我们可以在将其输入Fibbonnacci之前,使用该值来减少该数值的n模

这给了我们一个有界的Fibbonacci计算(希望是可处理的),以得到Fibbonacci结果mod 100000006,然后我们可以使用平方技术(mod 100000007)将2和-6增加到该次方,将它们相加并减去1

祝你好运计算皮萨诺周期。如果它是合理的(而且大多数看起来是合理的),你应该能够在几分之一秒内计算出十亿位数的n


现在,Pisano周期和Fibbonacci的封闭形式是基于一些数论和数学。因此,我们可以尝试直接为这个循环关系生成类似的数论/etc结果,而不是通过你找到的恒等式。可以说,这会更难,但可能会得到更清晰的答案。

你能不能仔细研究你遇到的问题?你尝试了什么?你的尝试是如何工作的?你用什么语言编程?请,学习如何创建一个。你可能需要使用费马的小定理。