Description
已知F(n)-n^3=F(n-2)-(n-1)^3,F(1)=1,F(2)=7,给出n,求F(n)%2009
Input
多组输入,每组用例占一行为一整数n,以n=0结束输入
Output
对于每个n,输出F(n)%2009
Sample Input
1
2
3
0
Sample Output
1
7
20
Solution
显然F(2*k)和F(2*k-1)的循环节都为2009,所以F(n)的循环节为4018,因此只要预处理出F(1)~F(4018)的值,每次输出F(n%4018)即可,注意4018^3会爆int,所以要用long long
Code
#include<stdio.h>
#define mod 2009
typedef long long ll;
ll f[4444];
void init()
{
f[1]=1ll;
f[2]=7ll;
for(ll i=3;i<=4018;i++)
f[i%4018]=(f[i-2]+((i*i*i)%mod-(i-1)*(i-1)*(i-1)%mod+mod)%mod)%mod;
}
int main()
{
init();
int n;
while(scanf("%d",&n),n)
{
n%=4018;
printf("%lld\n",f[n]);
}
return 0;
}