1. 程式人生 > >【找規律】bzoj 1002: [FJOI2007]輪狀病毒

【找規律】bzoj 1002: [FJOI2007]輪狀病毒

1002: [FJOI2007]輪狀病毒

Description

輪狀病毒有很多變種,所有輪狀病毒的變種都是從一個輪狀基產生的。一個N輪狀基由圓環上N個不同的基原子
和圓心處一個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示
在這裡插入圖片描述

N輪狀病毒的產生規律是在一個N輪狀基中刪去若干條邊,使得各原子之間有唯一的資訊通道,例如共有16個不
同的3輪狀病毒,如下圖所示

在這裡插入圖片描述
  現給定n(N<=100),程式設計計算有多少個不同的n輪狀病毒

Input

第一行有1個正整數n

Output

計算出的不同的n輪狀病毒數輸出

Sample Input

3

Sample Output

16


題解

題意

如上述意,不再贅述

思路

據打表
我們會發現奇數項似乎都可以分解為一個數的平方
1,4,11,29,76,199
將其單獨作為一個數列我們就會得到遞推式
a n = 3

a n 1 a n
2
a_n=3*a_{n-1}-a_{n-2}
再來觀察偶數項,偶數項(除了第二項)似乎都可以分解為5乘上一個數的平方,而數為:
3,8,21,55
將其單獨作為一個數列我們又可以得到遞推式
a n = 3 a n 1 a n 2 a_n=3*a_{n-1}-a_{n-2}
據此,我們既可以得到整個序列,由於答案較大,所以需要用到大數,這裡使用的是JAVA


AC程式碼

/**************************************************************
    Problem: 1002
    User: FlyWhite
    Language: Java
    Result: Accepted
    Time:1028 ms
    Memory:17864 kb
****************************************************************/
 
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
    public static void main(String[] args)
    {
        BigInteger[] a = new BigInteger[105];
        BigInteger[] b = new BigInteger[105];
        BigInteger[] ans = new BigInteger[105];
        a[1] = BigInteger.valueOf(1);
        a[2] = BigInteger.valueOf(3);
        for(int i = 3;i <= 99;++i)
            a[i] = a[i-1].add(a[i-2]);
        b[2] = BigInteger.valueOf(3);
        b[4] = BigInteger.valueOf(3);
        b[5] = BigInteger.valueOf(5);
        for(int i = 6;i <= 100;++i)
            b[i] = b[i-1].add(b[i-2]);
        for(int i = 1;i <= 99;i += 2)
            ans[i] = a[i].multiply(a[i]);
        ans[2] = b[2];
        for(int i = 4;i <= 100;i += 2)
            ans[i] = b[i].multiply(b[i]).multiply(BigInteger.valueOf(5));
        int n;
        Scanner input = new Scanner(System.in 
 
);
        while(input.hasNext())
        {
            n = input.nextInt();
            System.out.println(ans[n]);
        }
    }
}