HDOJ 2802 F(N)

来源:互联网 发布:js 字符串base64编码 编辑:程序博客网 时间:2024/06/02 04:56

HDACM2802

此题关键在于找循环节,函数:f(n)-n^3 = f(n-2)-(n-1)^3,For each test case, output on a line the value of the F(N)%2009
由这句话可以推出f(n)的最多的可能是2009*2009中可能,接下来必会循环,所以当 i>3&&f[i]==f[3]&&(3*i*(i-1)+1)%2009==19 就表示找到多少次一次循环。

import java.util.Scanner;public class Main{    public static void main(String[] args) {        Scanner sc = new Scanner( System.in );        int[] f = new int[2009*2009+4];        f[1] = 1;        f[2] = 7;        int pos = 2009*2009;        for (int i = 3; i <= pos; i++) {            f[i] = (3*i*(i-1)+1+f[i-2])%2009;            if (i>3&&f[i]==f[3]&&(3*i*(i-1)+1)%2009==19) {//找循环节                pos = i-3;                break;            }        }        while (sc.hasNext()) {            long n = sc.nextLong();            if (n==0) {                break;            }            if (n==1) {                System.out.println(1);                continue;            }            if (n==2) {                System.out.println(7);                continue;            }            System.out.println(f[(int)((n-2)%pos)+2]);        }    }}
原创粉丝点击