题意:
给出64位整数a、b以及不超过1000的正整数n,求斐波那契数列第a ^ b项模n的结果。 输入:情况数T,之后T行每行a、b、n。 输出:斐波那契数列第a ^ b项模n的结果。
分析:由于斐波那契数列的每一项都是由前两项相加得来,并且每一项都对n取模,所有 每一项的情况一共有n种,而相邻两项若组成有序数对,则不同的数对的情况也只有 n ^ 2种,所以只需要计算n * n项就可以找到数列规律。
题目:
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
AC代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
int t;
ull m,n;
ull dp[1000010];/*范围*/
int k;
int dfs(ull a,ull b,int c)
{int ans=1;int q=a%c;while(b){if(b&1)ans=ans*q%c;q=q*q%c;b>>=1;/*care 别忘了加=,>>是一个数学运算符号*/}return ans;
}
int main()
{scanf("%d",&t);while(t--){scanf("%llu%llu%d",&m,&n,&k);if(m==0||k==1){printf("0\n");continue;}dp[0]=0;dp[1]=1;int c;for(int i=2; i<=k*k; i++){dp[i]=(dp[i-1]+dp[i-2])%k;if(dp[i]==1&&dp[i-1]==0)/*已经找出一个周期长度了,在k*k内一定找得到*/{c=i-1;break;}}int ans=dfs(m,n,c);printf("%llu\n",dp[ans]);}return 0;
}