题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2802
f[1] = 1;
f[2] = 7;
f[n] = (f[n-2] - (n-1)*(n-1)*(n-1)+ n*n*n) % 2009, n>2;
给你一个n让你输出f[n];(n<1e9)由于n较大,所以不能直接输出,结果是对2009求余所以一定存在循环节,由于f(n)只与f(n-2)有关所以我们只需判断再次出现1或7即可;
#include <stdio.h> #include <algorithm> #include<string.h> #include<queue> using namespace std; #define met(a, b) memset(a, b, sizeof(a)) #define MOD 1000000007 #define N 5050 #define INF 0x3f3f3f3f typedef long long LL; int f[N] = {0, 1, 7}, n, m; int main() { for(int i=3; ; i++) { f[i] = (f[i-2] - (i-1)*(i-1)*(i-1)+ i*i*i) % 2009; if(i%2==1&& f[i]==1)///说明循环节已经存在; { m = i;///循环节为 m-1; break; } } while(scanf("%d", &n), n) { printf("%d\n", f[n%(m-1)]); } return 0; }
时间: 2024-10-03 00:46:19