Colossal Fibonacci Numbers!

Description
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<264 (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.

Samples
Input 复制
3
1 1 2
2 3 1000
18446744073709551615 18446744073709551615 1000
Output
1
21
250

题意:
我们都知道斐波那契数列,此题让我们求第a^b斐波那契数列的数对n取模为多少。
思路:
由题意可知,所求数列的数字非常大,①a的b次方本身很大就很难求②求一个极大的数字的斐波那契数列的数更是会超时
但是
我们发现斐波那契数列对n取模是有规律的,具有周期性。
a的b次方可以用快速幂来求
所以我们将此题的做题步骤分为:
1.计算斐波那契数列取模的周期,假设周期是3
eg.1 2 3 1 2 3 那么第四个数。。=第一个数。。
2.计算a的b次方与斐波那契数列取模中的第p个数相等(p<T 即在第一个周期内),这样只需要算出来一个周期内的数字即可,不会超时
那么我们用快速幂计算的时候,每次对T取模即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll maxn=1e6+1000;
int n,a[maxn],i,t;
int modd(ull base,ull n,int m)// 底数,指数, 模 
{
	int res=1;
	while(n)
	{
		if(n%2==1)
		res=res*base%m;
		base=base*base%m;
		n>>=1;
	}
	return res%m;
}
int T(ull k ,ull b,int m)
{
	int TT;
	for( i=2;;i++)
	{
		a[i]=(a[i-1]+a[i-2])%m;
		if(a[i]==a[1]&&a[i-1]==a[0])
		{
		TT=i-1;
		break;
		}
	}
	return  TT;
	
}
int main()
{
	cin>>t;
	while(t--)
	{
		ull k,b;
		cin>>k>>b>>n;
		if(k==0||n==1)
		{
			cout<<"0\n";
			continue;
		 } 
		a[0]=0,a[1]=1;
		int o=T(k,b,n);
		int pos=modd(k%o,b,o);
		cout<<a[pos]<<"\n";
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值