UVA11582 - Colossal Fibonacci Numbers!
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 < 2 64 (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.
Sample Input
3
1 1 2
2 3 1000
18446744073709551615 18446744073709551615 1000
Sample Output
1
21
250
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=1000000+5;
typedef unsigned long long ull;
int modnum[maxn];
int Mod;
int powermod(ull a,ull b,int c)
{
ull ans=1;
a%=c;
while(b)
{
if(b&1)
ans=ans*a%c;
a=a*a%c;
b=b>>1;
}
return ans;
}
int main()
{
int t;
ull a,b;
scanf("%d",&t);
while(t--)
{
scanf("%llu%llu%d",&a,&b,&Mod);
if(Mod==1 || a==0)
{
printf("0\n");
continue;
}
modnum[0]=modnum[1]=1;
int p=1;
for(int i=2;;i++)
{
modnum[i]=(modnum[i-1]+modnum[i-2])%Mod;
if(modnum[i]==1 && modnum[i-1]==1)
{
p=i-1;
break;
}
}
printf("%d\n",modnum[powermod(a,b,p)-1]);
}
return 0;
}