BZOJ 1002--[FJOI2007]轮状病毒(高精度)

本文探讨了轮状病毒变种的数学模型,通过特定的递推公式计算不同大小的轮状病毒变种数量,使用C++编程实现,并提供了解决方案及代码示例。

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 6858  Solved: 3745
[Submit][Status][Discuss]

Description

  轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示

  N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示

  现给定n(N<=100),编程计算有多少个不同的n轮状病毒

 

Input

  第一行有1个正整数n

Output

  计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1002 

Solution

  f[i]=(f[i-1]*3-f[i-2]+2)

  然而我也不会推,只会摸鱼。。

代码

#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
int n;
int b[50],c[50],e[100];
void jia(){
    int tmp=0;
    for(int i=0;i<50;i++){
        e[i]=c[i];
        c[i]=b[i]+c[i]+tmp;
        tmp=0;
        if(c[i]>9){tmp=c[i]/10;c[i]=c[i]%10;}
        b[i]=e[i];
    }
}
void cheng(){
    int tmp=0,f;
    for(int i=0;i<=50;i++)e[i]=0;
    for(int i=0;i<30;i++){
        for(int j=0;j<30;j++)
            e[i+j]+=b[i]*b[j];
        for(int j=0;j<=48;j++){
            e[j]+=tmp;
            tmp=0;
            if(e[j]>9){tmp=e[j]/10;e[j]=e[j]%10;}
        }
    }
} 
void jian(){
    e[0]-=4;
    for(int i=0;i<=48;i++){
        if(e[i]>=0)break;
        e[i]+=10;e[i+1]-=1;
    }
}
int main(){
    int f;
    b[0]=1;c[0]=3;
    scanf("%d",&n);
    for(int i=2;i<=n;i++) jia();
    cheng();
    if(n%2==0)jian();
    f=0;
    for(int i=49;i>=0;i--){
        if(e[i]>0) f=1;
        if(f==1) printf("%d",e[i]);
    }
    return 0;
}

  

  

This passage is made by Iscream-2001.

 

转载于:https://www.cnblogs.com/Yuigahama/p/9648213.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值