最近被一道题给坑了很久
题目如下
题目描述
斐波那契数列我们非常熟悉,同时斐波那契数列有如下的推广形式:
f[1] = x , f[2] = y, 对于n>3 ,f[n] = f[n-1] + f[n+1].
现在给出整数n,请输出f[n]%(1e9 + 7).
输入
第一行输入一个整数T,表示测试的样例数。
下面T组输入,每组输入两行,第一行是整数x,y(x∈[1,1000000000] , y∈[1,1000000000])
第二行是整数n(n∈[1,1000000000])
输出
按照题目要求输出。
样例输入
1 1 2 1
样例输出
1
本题的解决办法是找出规律,不要死磕n>3这个条件,找出规律后
即周期为6
a[3] = a[9]
a[4] = a[10]
...
且半周期的数互为相反数
故a[3] = -a[6]
a[4] = -a[7]
...
所以由此规律推出
a[1] = x, a[2] = y;
a[4] = -a[1], a[5] = -a[2],
a[3] = a[4] - a[5], a[6] = x-y;
之后就可以模6输出了
故数组只要开7就够了
但是你会发现前6个中有负数
而%的结果是不能有负数的
故我们通过加mod后取模输出保证正数
代码如下:
#include<stdio.h>
const int mod = 1e9+7;
typedef long long ll;
ll a[10];
ll n, x, y;
int main()
{
int t;
scanf("%d", &t);
while(t--){
scanf("%lld %lld", &x, &y);
scanf("%lld", &n);
a[1] = x, a[2] = y;
a[4] = -a[1], a[5] = -a[2],
a[3] = a[4] - a[5], a[6] = x-y;
printf("%lld\n", (a[(n-1)%6 + 1]%mod+mod)%mod);
/*
此处的两个重点:
1.数组下标,由于6的时候%6为0,而a[0]并无数据,所以采取(n-1)%6+1
2.先对a[(n-1)%6+1]取模,结果可能是负数,故我们继续加上mod保证正数后再取模。这时的结果必为正数。
*/
}
return 0;
}