UVa11582

/*UVa11582 - Colossal Fibonacci Numbers!
---首先所有数都是对n取模运算的,设F[i]=f(i)%n,则当二元组(F[i],F[i]+1)重复时整个序列就会出现周期循环,
---对n取模可知最多有n种余数,而二元组合最多有n^2种,所以只需要最多打长度为n^2的表就可以找到周期T。
---需要注意以下几点:
    1)n==1时候需要特判,所有数都可以整除0
	2)数据范围n<2^64,所以要用64位无符号整数来存取
*/
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
using namespace std;
typedef unsigned long long ULL;
const int maxn = 1000+10;

ULL F[maxn*maxn];

ULL quick_pow_mod(ULL a,ULL n,ULL m){
	if (n == 0)return 1;
	ULL res = 1;
	while (n > 0){
		if (n & 1)
			res = res*a%m;
		a = (a%m)*(a%m)%m;
		n >>= 1;
	}
	return res;
}
int main(){
	ULL a, b, n,t,T,i;
	cin >> t;
	while (t--){
		cin >> a >> b >> n;
		F[0] = 0; F[1] = 1;
		if (n == 1){ printf("0
"); continue; }
		for (i = 2;i<n*n; i++){
			F[i] = (F[i - 1] + F[i - 2]) % n;
			if (F[i] == 1 && F[i - 1] == 0)break; //找到周期
		}
		T = i - 1; //周期
		ULL id = quick_pow_mod(a, b, T);
		cout << F[id] << endl;
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/td15980891505/p/5802506.html