Description
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<264 (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.
Samples
Input 复制
3
1 1 2
2 3 1000
18446744073709551615 18446744073709551615 1000
Output
1
21
250
题意:
我们都知道斐波那契数列,此题让我们求第a^b斐波那契数列的数对n取模为多少。
思路:
由题意可知,所求数列的数字非常大,①a的b次方本身很大就很难求②求一个极大的数字的斐波那契数列的数更是会超时
但是
我们发现斐波那契数列对n取模是有规律的,具有周期性。
a的b次方可以用快速幂来求
所以我们将此题的做题步骤分为:
1.计算斐波那契数列取模的周期,假设周期是3
eg.1 2 3 1 2 3 那么第四个数。。=第一个数。。
2.计算a的b次方与斐波那契数列取模中的第p个数相等(p<T 即在第一个周期内),这样只需要算出来一个周期内的数字即可,不会超时
那么我们用快速幂计算的时候,每次对T取模即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll maxn=1e6+1000;
int n,a[maxn],i,t;
int modd(ull base,ull n,int m)// 底数,指数, 模
{
int res=1;
while(n)
{
if(n%2==1)
res=res*base%m;
base=base*base%m;
n>>=1;
}
return res%m;
}
int T(ull k ,ull b,int m)
{
int TT;
for( i=2;;i++)
{
a[i]=(a[i-1]+a[i-2])%m;
if(a[i]==a[1]&&a[i-1]==a[0])
{
TT=i-1;
break;
}
}
return TT;
}
int main()
{
cin>>t;
while(t--)
{
ull k,b;
cin>>k>>b>>n;
if(k==0||n==1)
{
cout<<"0\n";
continue;
}
a[0]=0,a[1]=1;
int o=T(k,b,n);
int pos=modd(k%o,b,o);
cout<<a[pos]<<"\n";
}
return 0;
}