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 }
弱者究竟为何而战?!