例10-1 uva11582(裴波那切数列)

题意:你的任务是计算f(a^b)除以n的余数。其中f(0)=f(1)=1,且对于所有非负整数i,f(i+2)=f(i+1)+f(i)。

思路:

由于是模运算,因此整个序列肯定会出现重复序列,所以先找出周期,在利用快速幂求出a^b,

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1000;
int F[N*N+5];
int n;
int T;
void fin_mod()
{
    F[0] = 0;
    F[1] = 1%n;
    for(int i = 2;;i++)
    {

        F[i] = (F[i-1] + F[i-2])%n;
        if(F[i] == F[1] && F[i-1] == F[0])
        {
            T = i - 1;
            break;
        }
    }
}

int pow_mod(ull x,ull n,int mod)
{
    if(n==0) return 1%mod;
    int ret=pow_mod(x,n/2,mod);
    ret=ret*ret%mod;
    if(n&1) return ret*x%mod;
    else return ret;
}

int main()
{
    ull a,b;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        cin>>a>>b>>n;
        fin_mod();
        int tt = pow_mod(a%T,b,T);
        printf("%d
",F[tt]);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Przz/p/5409722.html