Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 对于给定的n,如何在具有下列递推关系的序列中找到第n项?_Algorithm_Math_Matrix_Matrix Multiplication_Recurrence - Fatal编程技术网

Algorithm 对于给定的n,如何在具有下列递推关系的序列中找到第n项?

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)判决 有没有人能帮我解决这个问题,并指出代码中的错误,这样我以后就可以自己解决这些问题了 注意,这里是第一次。如果我做错了什么,错过了什么,请

对于给定的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)判决

有没有人能帮我解决这个问题,并指出代码中的错误,这样我以后就可以自己解决这些问题了


注意,这里是第一次。如果我做错了什么,错过了什么,请道歉。

WA的可能原因是,您没有做任何修改就返回了a或b。 试试看

如果您仍然获得WA,请给出一些测试用例或问题链接

  • 技术:
    也许你被要求找到res模r的值,所以0,你能告诉我们一个“某些情况”让你得到一个“错误答案”吗?没有这一点,你的问题是不完整的,尽管就我所见,它在其他方面是好的。我不知道你为什么说需要矩阵求幂。这个循环可以用斐波那契循环使用的相同技术来解决。我说的是我不明白为什么在一维循环中需要矩阵乘法吗?@RoryDaulton在问题解决之前,测试用例是不可用的,否则我会自己调试。@JWWalker说需要矩阵求幂,我的意思是O(logn)复杂度是可取的。我以前用这个算法计算过斐波那契数,所以我很自然地想到了这个。如果你有更合适的技术或算法,请分享。我一点也不感激。这是问题的最后一步,a和b必须事先计算。我已经在那里应用了模。@jahas如果你等到模的末尾,你已经在很多情况下溢出了
    long-long int
    。@pjs我在初始化它时应用了它。另外,它的值在10左右时失败,所以情况并非如此。我已经在应用第二个技巧了。我尝试了第一个,但它仍然给出了一些正确和错误。这个主意不错。这个答案基本上是正确的,但仍有弄乱负数的余地。我建议首先减少除N mod
    r
    之外的所有数值,包括
    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