``在看这道题之前
知识点一:斐波拉契数列对任何正整数取模所得到的数列是一个周期数列
(由此小心其他不知名的数学类问题也有可能是这样找规律)
知识点二:快速幂取模:刘汝佳用的矩阵快速幂
我的代码很简单抄的(刘汝佳紫书P315面的代码少了下面的条件)
a=a%n;
他原来也不是什么神人啊,,,
粗心的一批
看代码
int powermod(unsigned long long a,unsigned long long b,int n)
{
if(b==0)
return 1;//VIP 大数取模中很重要的这个细节
//如果指数为0,则算出来的结果为1
//ans=(x*x)modn
int x=powermod(a,b/2,n);
unsigned long long ans=(unsigned long long)x*x%n;
a=a%n;//这一步很重要,从何而来呢,下面的推断告诉你它的巴啦啦能量
if(b%2==1)
//ans=((x*x)*a) % n =((x*x)%n * a%n ) % n = (ans * a%n )%n;
ans=ans*a%n;
return (int) ans;
}
下面来看总代码吧
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int powermod(unsigned long long a,unsigned long long b,int n)
{
if(b==0)
return 1;//VIP 大数取模中很重要的这个细节
//如果指数为0,则算出来的结果为1
//ans=(x*x)modn
int x=powermod(a,b/2,n);
unsigned long long ans=(unsigned long long)x*x%n;
a=a%n;//这一步很重要,从何而来呢,下面的推断告诉你它的巴啦啦能量
if(b%2==1)
//ans=((x*x)*a) % n =((x*x)%n * a%n ) % n = (ans * a%n )%n;
ans=ans*a%n;
return (int) ans;
}
long long F[10000001];
int main()
{
int t;
cin>>t;
while(t--){
unsigned long long a,b;
int n;
int p;
int i;
//memset(F,0,sizeof(F));初始化是一个好习惯!!!!但是在这里那么大的F超时了!!!!
//改了我半天!!!!!!
//2 3 1000
cin>>a>>b>>n;
//1 1 2 3 5 8 13 21 34 55 89
//1 1 2 0 2 2 1 0 1 1
F[1]=1%n;
F[2]=1%n;
for(i=3;i<=1000000;i++)
{
//18446744073709551615 18446744073709551615
//250
//1 2 3 4 5 6 7 8
F[i]=(F[i-1]%n+F[i-2]%n)%n;
if(F[i]==F[2]&&F[i-1]==F[1])
{
p=i;
break;
}
}
int T=p-2;
F[0]=F[T];
cout<<F[powermod(a,b,T)]<<endl;//此处有问题,输出2,3,1500等进行草稿本debug
}
}