题目描述
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;
}