【找規律】bzoj 1002: [FJOI2007]輪狀病毒
阿新 • • 發佈:2018-11-15
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
將其單獨作為一個數列我們就會得到遞推式
再來觀察偶數項,偶數項(除了第二項)似乎都可以分解為5乘上一個數的平方,而數為:
3,8,21,55
將其單獨作為一個數列我們又可以得到遞推式
據此,我們既可以得到整個序列,由於答案較大,所以需要用到大數,這裡使用的是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]);
}
}
}