【找规律】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
将其单独作为一个数列我们就会得到递推式
an=3∗an−1−an−2 a_n=3*a_{n-1}-a_{n-2} an=3an1an2
再来观察偶数项,偶数项(除了第二项)似乎都可以分解为5乘上一个数的平方,而数为:
3,8,21,55
将其单独作为一个数列我们又可以得到递推式
an=3∗an−1−an−2a_n=3*a_{n-1}-a_{n-2} an=3an1an2
据此,我们既可以得到整个序列,由于答案较大,所以需要用到大数,这里使用的是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]);
        }
    }
}


转载于:https://www.cnblogs.com/fly-white/p/10092694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值