BZOJ1002 [FJOI2007]轮状病毒

可以找规律,题目大概的意思就是求给定的图的不同的生成树的个数

可以求出n为1到10时的答案

1 5 16 45 121 320 841 2205 5776 15125

规律是

设odd[]为奇数项的平方根

那么odd[i] = odd[i-1]*3-odd[i-2];(i>=3)

偶数项每个除以5也可以得到上面的规律

最后在用高精度跑一下

C++基本是10ms以内,Java 880ms。。。。

 1 import java.io.*;
 2 import java.util.*;
 3 import java.math.*;
 4 class Main
 5 {
 6     public static void main(String args[]){
 7         Scanner cin = new Scanner(System.in);
 8         int n = cin.nextInt();
 9         BigInteger odd[] = new BigInteger[105];
10         BigInteger even[] = new BigInteger[105];
11         odd[1] = even[1] = BigInteger.ONE;
12         odd[2] = new BigInteger("4");
13         even[2] = new BigInteger("3");
14         for(int i = 3;i<=51;++i)
15             odd[i] = odd[i-1].multiply(even[2]).subtract(odd[i-2]);
16         for(int i = 3;i<=51;++i)
17             even[i] = even[i-1].multiply(even[2]).subtract(even[i-2]);
18         if(n%2==1)System.out.println(odd[(n+1)/2].multiply(odd[(n+1)/2]));
19         else System.out.println(even[n/2].multiply(even[n/2]).multiply(new BigInteger("5")));
20     }
21 }

 

posted on 2015-08-03 12:28  round_0  阅读(130)  评论(0编辑  收藏  举报

导航