Algorithm 求解递推问题

Algorithm 求解递推问题,algorithm,recursion,Algorithm,Recursion,我被赋予F(0)=X和F(I)=(A⋅F(i)−1) ^2+B⋅F(i)−1) +C)%1000000用于1≤我≤N 现在给定N、A、B、C和X,如何有效地查找所有N元素 我需要将这N个元素分成2组,其中最大的元素在第1组,第2组,第3组在第1组,依此类推…最后需要找到两组元素之和的绝对差 我能在不计算所有元素的情况下找到这个差异吗,因为N可以大到10^7和A,B,C,X最大值为100。请注意,序列的下一个元素仅取决于前一个元素,因为每个结果都是一个取1000000模的整数,所以不同的元素不超过

我被赋予
F(0)=X
F(I)=(A⋅F(i)−1) ^2+B⋅F(i)−1) +C)%1000000
用于
1≤我≤N

现在给定
N
A
B
C
X
,如何有效地查找所有
N
元素

我需要将这N个元素分成2组,其中最大的元素在第1组,第2组,第3组在第1组,依此类推…最后需要找到两组元素之和的绝对差


我能在不计算所有元素的情况下找到这个差异吗,因为N可以大到
10^7
A
B
C
X
最大值为100。

请注意,序列的下一个元素仅取决于前一个元素,因为每个结果都是一个取1000000模的整数,所以不同的元素不超过M=1000000。因此,序列从某个点开始是周期性的。您可以生成前几个元素(不超过M个),直到找到周期,然后如果元素总数为N,则立即知道每个元素有多少个


现在,与10^7相比,10^6至少有一些改进。一旦你知道从0到999999的每个数字在序列中出现了多少次,你也可以在O(M)运算中找到所需的差异。

如果我是你,我就不怕计算那些
10^7
元素。由于它们的范围为
[0 1000000[
,因此可以计算值的直方图(1000000个计数器),您将对其进行后期处理以获得所需信息(并遵循@Gassa)


迭代公式时要注意溢出,因为
F^2
不适合32位。

这是什么用例?(最初的问题可能是)@AlmaDo我需要计算两组元素之和的绝对差。@AlmaDo你可以说这是一项棘手的任务..:p@user132263这看起来像是一个递增函数。就像它在i=0时的最小值&它在i=N时偷看。你能证实吗?@hemanth我对此表示怀疑。你怎么说它不依赖于A、B、C或xhe的值呢?你能解释一下吗n通过一些伪码或其他什么。我没有得到确切的不清楚的东西?主要的一点是,如果F(x)=F(y),那么F(x+1)=F(y+1),F(x+2)=F(y+2)等等。此外,每个F(x)是一个介于0和999999之间的整数,所以不迟于1000000步之后,我们将找到一些F(i)=F(j)。如何找到O(M)中所需的差分操作?假设有15个数字9999999,没有999999 8,14个数字999999 7,15个数字999999 6,14个数字999999 5等等。其中,14个9999999形成7对零差。第一个非零差对是9999999-999999 7=2。下一个go 12 999999 7在6个零对中,下一个非零对是999999 7-999999 6。下一个go 14 999999 6在七个零对中,之后149995在七个零对中,依此类推。您将需要O(M)内存来存储0,1,…,M-1的出现次数。我们还可以为每个这样的数字K存储第一个x,使F(x)=K。之后,当某个整数B第二次出现时(其出现次数变为2),我们已经知道它是哪个整数(B),以及它第一次出现的时间(比如,在时间y:F(y)=B)。因此,我们可以计算周期的长度。我们也已经知道周期的元素:它们是第一次出现>=y的整数。