Codeforces 450B Jzzhu and Sequences(递推找规律)

题目链接 http://codeforces.com/problemset/problem/450/B

如果按照题目的递推公式写下去,数据必定会非常大,不现实。

根据以前的经验,我觉得这样的题目肯定是有规律的,可能写到多少项以后就会出现循环

试着写了十几项,发现他是6个一循环

需要注意的是数据范围,因为最后输出结果是mod1000000007,所以需要对负数进行处理

负数取模的方法是加上模的是以后将数据控制在0-mod之间,在取模;
我自己开始写的代码注意到了负数取模的问题,但没有注意到数据范围,结果WA好多次
还有把数组1-6定义,然后分情况讨论,开始分类情况有问题,输入为6的倍数的时候根据判断条件输出的是a[0],也WA几次

#include
#include
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
*/
另外一种解法,是用矩阵快速幂,这里就不再赘述。

你可能感兴趣的:(Codeforces 450B Jzzhu and Sequences(递推找规律))