斐波那契数列循环节

题目
题意大致是输入2的64次方以内的数求出它们取模以后下标的斐波那契数列的值,斐波那契数列在模上某个值后是具有循环节的,我们要把循环节的长度算出来,然后把循环节长度带入快速幂最后再模上n求出答案。本题坑点就是数据范围用longlong还不够要用unsigned long long,当n为1的时候答案都是0。
AC代码:

#include<iostream>
using namespace std;
typedef unsigned long long ull;
const	int N=1010000;
int f[N];
int qs(ull a,ull b,int n)
{
	int res=1;
	while(b)
	{
		if(b&1)	res=(ull)res*a%n;
		b>>=1;
		a=(ull)a*a%n;
	}
	return res;
}
int main()
{
	ull a,b;
	int t;
	int n;
	int len=1;
	cin>>t;
	while(t--){
	cin>>a>>b>>n;
	f[0]=0,f[1]=1;
	
	if(n==1){
		printf("0\n");
		continue;
	}
	for(int i=2;i<=n*n+100;i++)
	{
		f[i]=(f[i-1]+f[i-2])%n;
		if(f[i]==1&&f[i-1]==0)
		{
			len=i-1;
			break;
		}
	}
	cout<<f[qs(a%len,b,len)]<<endl;	}
	return 0;
}
发布了97 篇原创文章 · 获赞 8 · 访问量 1680

猜你喜欢

转载自blog.csdn.net/qq_45961321/article/details/104346343