链接:
点击打开链接
题目描述
wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)
一天他突发奇想,想求F(a^b)%c
输入描述:
输入第一行一个整数T(1<=T<=100),代表测试组数 接下来T行,每行三个数 a,b,c (a,b<=2^64) (1<c<1000)
输出描述:
输出第a^b项斐波那契数对c取余的结果
示例1
输入
3 1 1 2 2 3 1000 32122142412412142 124124124412124 123
输出
1 21 3
解题思路: 你先找住来斐波那契数组在对某个c取余后经历一个轮回所需要的次数,我们设为te
a^b=(a%te)^(b%te) 这样化简
然后来一波快速幂就行了。
如果a等于0或者是c等于1的时候 答案为0(题没考虑到);
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e7+10;
long long dp[maxn],n,m;
long long a,b,c;
int main(){
int i,j,t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&a,&b,&c);
if(a==0||c==1){
printf("0\n");continue;
}
long long te;
dp[0]=0;dp[1]=dp[2]=1;
for(i=3;i<maxn;i++){
dp[i]=(dp[i-1]+dp[i-2])%c;
if(dp[i]%c==1&&dp[i-1]%c==1){
te=i-2;
break;
}
}
long long temp=b%te,ans=1,q=a%te;
while(temp){
if(temp&1) ans=(ans*q%te)%te;
q=(q*q)%te;
temp/=2;
}
if(ans==0) ans=te;
printf("%lld\n",dp[ans]%c);
}
return 0;
}
//3 1 1 2 2 3 1000 32122142412412142 124124124412124 123