输入unsigned long long 型 a,b 和 不超过1000 的正整数n ,输出 f(a^b)%n,f()代表斐波那契数。
f(0)=0, f(1)=1 。
解:
因为f(i)=f(i-1)+f(i-2), 所以如果有 f(x-1)==f(i-1)&&f(x)==f(i) 且x!=i ,那么势必会出现循环。
n很小,在[1,n^2+2]内必须会出现这样一对x和i,即周期一定<=n^2 (鸽笼原理)。
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const int INF =0x3f3f3f3f;
const int maxn= 1000 ;
ll a,b;
ll fib[ (maxn+4)* (maxn+4)];
int circle,n;
ll qb(ll a ,ll x ,ll mod)
{
ll base=a;
ll ans=1;
while(x)
{
if(x&1) ans=ans*base%mod;
base=base*base%mod;
x=x>>1;
}
return ans;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
cin>>a>>b>>n;
fib[0]=0%n;
fib[1]=1%n;
for(int i=2;i<=1000050;i++)
{
fib[i]= (fib[i-1]+fib[i-2])%n;
if(fib[i]==fib[1]&&fib[i-1]==fib[0])
{
circle= i-1;
break;
}
}
ll ret=qb(a%circle,b,circle);
ll ans= fib[ret]%n;
cout<<ans<<endl;
}
return 0;
}