每日一题(1)2018年东北农业大学春季校赛 K wyh的数列

题目描述

wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)
一天他突发奇想,想求F(a^b)%c

输入描述:

输入第一行一个整数T(1<=T<=100),代表测试组数 接下来T行,每行三个数 a,b,c (a,b<=2^64) 

输入

3
1 1 2
2 3 1000
32122142412412142 124124124412124 123

输出

1
21
3
思路

运用快速幂,并且数据为2的64次方则不能使用longlong(2的63次方-1),应该使用unsigned longlong,并且对斐波那契数列找循环,得到周期。

#include<iostream>
 
#define ll  unsigned long long
using namespace std;
ll F[1010000];
ll quick(ll a,ll b,ll c)
{
    ll temp=1;
    a%=c;
    while (b!=0)
    {
        if (b%2==1)
            temp=(temp*a)%c;
        a=(a*a)%c;
        b/=2;
    }
    return temp;
}
int main()
{
    ll t,a,b,c;
    cin>>t;
    while (t--)
    {
        cin>>a>>b>>c;
        F[0]=0,F[1]=1;
        for (int i=2;;i++)
        {
            F[i]=(F[i-1]+F[i-2])%c;
            if (F[i-1]==0&&F[i]==1)
            {
                c=i-1;
                break;
            }
        }
        ll ans=quick(a,b,c);
        cout<<F[ans]<<endl;
    }
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值