UVa 11582 - Colossal Fibonacci Numbers!
题意
输入两个非负整数a、b和正整数n(0≤a,b<2^64,1≤n≤1000),你的任务是计算f(a^b)除以n的余数。其中f(0)=f(1)=1,且对于所有非负整数i, f(i+2)=f(i+1)+f(i)。
思路
f[i] %= n
会出现循环
记录
快速幂取模 – 模版
int quick(int a,int b,int c)
{
int ans = 1; //记录结果
a = a % c; //预处理,使得a处于c的数据范围之下
while(b!=0)
{
if(b & 1) ans = (ans*a) % c; //如果b的二进制位不是0,那么我们的结果是要参与运算的
b >>= 1; //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
a = (a*a) % c; //不断的加倍
}
return ans;
}
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef unsigned long long ULL;
const int maxn = 1000+100;
ULL Fbnq[maxn*maxn];
int solve( ULL a, ULL b, int M )
{
int k = 1;
while( b ){
if( b & 1 ) k = (k*a)%M;
k *= a, k %= M;
a = (a*a) % M;
b >>= 1;
}
return k;
}
void Fibonacci( ULL a, ULL b, int n ){
int M;
if( n == 1 || a == 0 ){
puts("0");
return;
}
Fbnq[1] = 1, Fbnq[2] = 1;
for( int i = 3; i <= n*n+10; i++ )
{
Fbnq[i] = Fbnq[i-1] + Fbnq[i-2];
Fbnq[i] %= n;
if( Fbnq[i] == 1 && Fbnq[i-1] == 1){
M = i - 2;
break;
}
}
int k = solve( a % M, b, M );
printf("%d\n",Fbnq[k]);
}
int main()
{
int T, n;
ULL a, b;
scanf("%d",&T);
while(T--){
scanf("%llu%llu%d",&a,&b,&n);
Fibonacci( a, b, n );
}
return 0;
}