这道题目看过之后就知道一定是循环题,前四十分钟一直在找循环节,尼玛,就是找不到,每次都是输出几百或一两千个数字,然后趴在屏幕上找循环,怎么找就是找不到。后来突然想到了优化的方法,因为f[1]=1,f[2]=7,f[3]=20,,我只需要判定如果当前f[i]=20且f[i-1]=7,且f[i-2]=1,跳出循环,终于被我找到了,尼玛 ,4018,坑啊!!!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
__int64 f[10010];
int main()
{
__int64 n,i;
f[0]=0;
f[1]=1;f[2]=7;
for(i=3;i<=4018;i++)
{
f[i]=f[i-2]+i*i*i-(i-1)*(i-1)*(i-1);
f[i]=f[i]%2009;
}
while(scanf("%I64d",&n),n)
{
printf("%I64d\n",f[n%4018]);
}
return 0;
}