(F - Colossal Fibonacci Numbers! UVA - 11582 )斐波那契数列求循环节!!!

本文介绍了一种高效的算法,用于计算大数斐波那契数列中特定项的值并对其余数进行求解。通过使用快速幂取模和循环节求解技巧,该算法能够在短时间内准确地计算出斐波那契数列中 a^b % n 的结果,即使 a 和 b 达到 2^64-1 的规模。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

The i’th Fibonacci number f(i) is recursively defined in the following way:

      • f(0) = 0 and f(1) = 1

      • f(i + 2) = f(i + 1) + f(i) for every i ≥ 0 Your task is to compute some values of this sequence.

Input

     Input begins with an integer t ≤ 10, 000, the number of test cases. Each test case consists of three integers a, b, n where 0 ≤ a,      b < 2 64 (a and b will not both be zero) and 1 ≤ n ≤ 1000.

Output

     For each test case, output a single line containing the remainder of f(a b ) upon division by n.

Sample Input

     3

     1 1 2

     2 3 1000

     18446744073709551615 18446744073709551615 1000

Sample Output

    1

    21

    250

题意:

       f[0] = 1, f[1] = 1; 给定一个n,求f[a^b]%n的结果。a,b达到2^64 - 1大。

 代码:

#include <iostream>

using namespace std;

typedef unsigned long long ULL;

const int N = 1000;
int fib[N * N];

ULL quickmod(ULL x, ULL n, ULL m)

{

    ULL result = 1;

    for(; n; n>>=1)

    {

        if(n & 1)

        {

            result *= x;

            result %= m;

        }

        x *= x;

        x %= m;

    }

    return result;

}

int main()

{

    int t;

    cin>>t;

    while(t--)

    {

        ULL a, b;

        int n, M = 2;

        cin>>a>>b>>n;

        fib[0] = 0;

        fib[1] = 1 % n;

        for(int i=2; i<=n * n; i++)

        {

            fib[i] = (fib[i - 2] + fib[i - 1]) % n;        //打表n*n的斐波那契数列

            if(fib[i - 2] == 1 && fib[i - 1] == 0)      //打表之后求循环节

            {

                M = i - 1;
                break;

            }

        }

        int k = quickmod(a % M, b, M);        //快速幂取模

        cout<<fib[k]<<endl;

    }
    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值