题目:
输入任意 n (1<=N<=10^9) 求 F(N)%2009
AC code (1):
#include <iostream>
using namespace std;
#define M 4019
int f[M];
int main()
{
long i,n;
f[1]=1;f[2]=7;f[3]=20;
for(i=4;i<M;i++)
{
f[i]=f[i-2]+3*i*(i-1)+1;
if(f[i]>=2009) f[i]%=2009;
}
while(cin>>n && n)
{
cout<<f[n%4018]<<endl;
}
return 0;
}
AC code(2) :
#include<iostream>
using namespace std;
int q(int n)
{
if(n==1)return 1;
if (n==2)return 7;
else return (q(n-2)-(n-1)*(n-1)*(n-1)+n*n*n)%2009;
}
int main()
{
int n;
int a[4020];
for (int i=1; i<=4018; i++)
a[i]=q(i)%2009;
while (cin>>n&&n)
cout<<a[n%4018]<<endl;
return 0;
}
总结:
此题明显是要求找规律的,而且结果一定是2009的倍数,所以依次测试4018,6027。。。从结果中观察循环节为4018。代码一不能在C++编译下通过,代码二可以在C++和G++下都能通过,这一点还真纳闷了,请大牛们指点