Algorithm 对于给定的n,如何在具有下列递推关系的序列中找到第n项?
对于给定的n,如何在具有下列递推关系的序列中找到第n项 F(n)=2*b*F(n-1)–F(n-2),F(0)=a,F(1)=b 其中a和b是常数 N的值相当大(1≤ N≤ 1012)因此需要矩阵求幂 这是我的代码Algorithm 对于给定的n,如何在具有下列递推关系的序列中找到第n项?,algorithm,math,matrix,matrix-multiplication,recurrence,Algorithm,Math,Matrix,Matrix Multiplication,Recurrence,对于给定的n,如何在具有下列递推关系的序列中找到第n项 F(n)=2*b*F(n-1)–F(n-2),F(0)=a,F(1)=b 其中a和b是常数 N的值相当大(1≤ N≤ 1012)因此需要矩阵求幂 这是我的代码ll是long int的类型定义,其值取模r 然而,在所有情况下,我都面临着获取所需值的问题,也就是说,在某些情况下,我得到了错误的答案(WA)判决 有没有人能帮我解决这个问题,并指出代码中的错误,这样我以后就可以自己解决这些问题了 注意,这里是第一次。如果我做错了什么,错过了什么,请
ll
是long int
的类型定义,其值取模r
然而,在所有情况下,我都面临着获取所需值的问题,也就是说,在某些情况下,我得到了错误的答案(WA)判决
有没有人能帮我解决这个问题,并指出代码中的错误,这样我以后就可以自己解决这些问题了
注意,这里是第一次。如果我做错了什么,错过了什么,请道歉。WA的可能原因是,您没有做任何修改就返回了a或b。 试试看 如果您仍然获得WA,请给出一些测试用例或问题链接
也许你被要求找到res模r的值,所以0,你能告诉我们一个“某些情况”让你得到一个“错误答案”吗?没有这一点,你的问题是不完整的,尽管就我所见,它在其他方面是好的。我不知道你为什么说需要矩阵求幂。这个循环可以用斐波那契循环使用的相同技术来解决。我说的是我不明白为什么在一维循环中需要矩阵乘法吗?@RoryDaulton在问题解决之前,测试用例是不可用的,否则我会自己调试。@JWWalker说需要矩阵求幂,我的意思是O(logn)复杂度是可取的。我以前用这个算法计算过斐波那契数,所以我很自然地想到了这个。如果你有更合适的技术或算法,请分享。我一点也不感激。这是问题的最后一步,a和b必须事先计算。我已经在那里应用了模。@jahas如果你等到模的末尾,你已经在很多情况下溢出了
long-long int
。@pjs我在初始化它时应用了它。另外,它的值在10左右时失败,所以情况并非如此。我已经在应用第二个技巧了。我尝试了第一个,但它仍然给出了一些正确和错误。这个主意不错。这个答案基本上是正确的,但仍有弄乱负数的余地。我建议首先减少除N modr
之外的所有数值,包括a
、b
和-1
,这样问题中的所有数值从一开始就是正的,小于r
。再次强调,在最初的减少中,要注意正确处理消极因素。最后,要让它起作用。我把你的公式和关系搞混了,把它当作F[0][0]*b-F[0][1]*a。我现在才注意到。我让它作为F[0][0]*b-F[1][0]*a(结果的另一个表达式)工作。
void multiply(ll F[2][2], ll M[2][2])
{
ll x = ((F[0][0] * M[0][0]) % r + (F[0][1] * M[1][0]) % r) % r;
ll y = ((F[0][0] * M[0][1]) % r + (F[0][1] * M[1][1]) % r) % r;
ll z = ((F[1][0] * M[0][0]) % r + (F[1][1] * M[1][0]) % r) % r;
ll w = ((F[1][0] * M[0][1]) % r + (F[1][1] * M[1][1]) % r) % r;
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
void power(ll F[2][2], ll n, ll b)
{
if (n == 0 || n == 1)
return;
ll M[2][2] = {{2 * b, -1}, {1, 0}};
power(F, n / 2,b);
multiply(F, F);
if (n % 2 != 0)
multiply(F, M);
}
ll rec(ll n, ll b, ll a)
{
ll F[2][2] = {{2 * b, -1}, {1, 0}};
if (n == 0)
return a;
if (n == 1)
return b;
power(F, n - 1,b);
return F[0][0] % r;
}
if (n == 0)
return a%r;
if (n == 1)
return b%r;
( F(n) ) = ( 2b -1 ) * ( F(n-1) )
( F(n-1) ) ( 1 0 ) ( F(n-2) )
F(n) = 2b * F(n-1) + (-1) * F(n-2)
( F(n) ) = ( 2b -1 ) ^{n-1} * ( F(1) )
( F(n-1) ) ( 1 0 ) ( F(0) )
F(n) = X * F(1) + Y * F(0)
( 2b -1 ) ^{n-1} = ( X Y )
( 1 0 ) ( Z T )
(F[0][0] * b + F[0][1] * a) % r
((F[0][0] * b + F[0][1] * a) % r + r) % r