题目大意:
现只有一个测例,让你求一个序列f中fn的值,其中f1 = x, f2 = y, fi = fi-1 + fi+1(i > 1),其中fn的n的范围为[1, 2×10^9],并且|x|、|y| ≤ 10^9。
注释代码:
/*
* Problem ID : CF 450B Jzzhu and Sequences
* Author : Lirx.t.Una
* Language : GNU C
* Run Time : 30 ms
* Run Memory : 0 KB
*/
#include <stdio.h>
#define MOD 1000000007
typedef __int64 llg;
//可以发现该序列是一个循环序列
//循环节为x、y、y - x、-x、-y、x - y
//最早的循环节下标为1、2、3、4、5、6
int
main() {
int n;
int x, y;
int ans;
scanf("%d%d%d", &x, &y, &n);
switch ( n % 6 ) {
case 0 : ans = x - y; break;
case 1 : ans = x; break;
case 2 : ans = y; break;
case 3 : ans = y - x; break;
case 4 : ans = -x; break;
case 5 : ans = -y; break;
default : break;
}
//由于负数的余数是先通过MOD将其加成整数后才取余的
//x和y最小可以取到-10^9,因此至少应该加两次MOD保证ans一定是正的
ans = ( (llg)ans + MOD + MOD ) % MOD;
printf("%d\n", ans);
return 0;
}
无注释代码:
#include <stdio.h>
#define MOD 1000000007
typedef __int64 llg;
int
main() {
int n;
int x, y;
int ans;
scanf("%d%d%d", &x, &y, &n);
switch ( n % 6 ) {
case 0 : ans = x - y; break;
case 1 : ans = x; break;
case 2 : ans = y; break;
case 3 : ans = y - x; break;
case 4 : ans = -x; break;
case 5 : ans = -y; break;
default : break;
}
ans = ( (llg)ans + MOD + MOD ) % MOD;
printf("%d\n", ans);
return 0;
}