题目链接 http://codeforces.com/problemset/problem/450/B
如果按照题目的递推公式写下去,数据必定会非常大,不现实。
根据以前的经验,我觉得这样的题目肯定是有规律的,可能写到多少项以后就会出现循环
试着写了十几项,发现他是6个一循环
需要注意的是数据范围,因为最后输出结果是mod1000000007,所以需要对负数进行处理
负数取模的方法是加上模的是以后将数据控制在0-mod之间,在取模;
我自己开始写的代码注意到了负数取模的问题,但没有注意到数据范围,结果WA好多次
还有把数组1-6定义,然后分情况讨论,开始分类情况有问题,输入为6的倍数的时候根据判断条件输出的是a[0],也WA几次
#include<iostream>
#include<cstdio>
using namespace std;
#define mod 1000000007
long long a[10];
long long n;
int main()
{
long long x,y;
while(scanf("%lld%lld",&x,&y)!=EOF)
{
long long n;
scanf("%lld",&n);
a[0]=x;
a[1]=y;
a[2]=y-x;
a[3]=-x;
a[4]=-y;
a[5]=x-y;
n--;
if(a[n%6]>=0)
printf("%lld\n",a[n%6]%mod);
else
printf("%lld\n",(a[n%6]+2*mod)%mod);
}
return 0;
}
/*
956749456 906548654
4654
*/
/*
100000000 -100000000
3
*/
另外一种解法,是用矩阵快速幂,这里就不再赘述。