要注意该函数mod7的余数一定是循环的。设法求出循环节长度,并且保留一个完整的循环节,程序接下来就没问题了~
#include<iostream>
using namespace std;
const int N = 7;
int loop;
int f[55];
void sFibonacci(int a,int b);
int sFibonacci(long n);
int main()
{
int a,b;
long n;
while(cin>>a>>b>>n)
{
if(0==a && 0==b && 0==n) break;
if(n<=2)
{
cout<<1<<endl;
continue;
}
a%=N;
b%=N;
sFibonacci(a,b);
cout<<sFibonacci(n)<<endl;
}
return 0;
}
void sFibonacci(int a,int b)
{
f[1]=f[2]=1;
for(loop=3;1;loop++)
{
f[loop] = (a*f[loop-1] + b*f[loop-2]) % N;
if(loop>4 && (f[loop]==f[4] && f[loop-1]==f[3]))
break;
}
loop-=4;
}
int sFibonacci(long n)
{
if(n<=2) return 1;
else return f[(n-3)%loop+3];
}
using namespace std;
const int N = 7;
int loop;
int f[55];
void sFibonacci(int a,int b);
int sFibonacci(long n);
int main()
{
int a,b;
long n;
while(cin>>a>>b>>n)
{
if(0==a && 0==b && 0==n) break;
if(n<=2)
{
cout<<1<<endl;
continue;
}
a%=N;
b%=N;
sFibonacci(a,b);
cout<<sFibonacci(n)<<endl;
}
return 0;
}
void sFibonacci(int a,int b)
{
f[1]=f[2]=1;
for(loop=3;1;loop++)
{
f[loop] = (a*f[loop-1] + b*f[loop-2]) % N;
if(loop>4 && (f[loop]==f[4] && f[loop-1]==f[3]))
break;
}
loop-=4;
}
int sFibonacci(long n)
{
if(n<=2) return 1;
else return f[(n-3)%loop+3];
}