题目
题意大致是输入2的64次方以内的数求出它们取模以后下标的斐波那契数列的值,斐波那契数列在模上某个值后是具有循环节的,我们要把循环节的长度算出来,然后把循环节长度带入快速幂最后再模上n求出答案。本题坑点就是数据范围用longlong还不够要用unsigned long long,当n为1的时候答案都是0。
AC代码:
#include<iostream>
using namespace std;
typedef unsigned long long ull;
const int N=1010000;
int f[N];
int qs(ull a,ull b,int n)
{
int res=1;
while(b)
{
if(b&1) res=(ull)res*a%n;
b>>=1;
a=(ull)a*a%n;
}
return res;
}
int main()
{
ull a,b;
int t;
int n;
int len=1;
cin>>t;
while(t--){
cin>>a>>b>>n;
f[0]=0,f[1]=1;
if(n==1){
printf("0\n");
continue;
}
for(int i=2;i<=n*n+100;i++)
{
f[i]=(f[i-1]+f[i-2])%n;
if(f[i]==1&&f[i-1]==0)
{
len=i-1;
break;
}
}
cout<<f[qs(a%len,b,len)]<<endl; }
return 0;
}