【bzoj1002】[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

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

#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
int a[10000],b[10000],c[10000];
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    if (n==1){cout<<"1";return 0;}
    if (n==2){cout<<"5";return 0;}
    a[1]=1;b[1]=5;
    int lena=1,lenb=1,lenc=0;
    for (int l=3;l<=n;l++)
    {
        int z=0;
        for (int i=1;i<=lenb||z!=0;i++)
        {
            c[i]=b[i]*3+z;
            z=c[i]/10;
            c[i]%=10;
            lenc=max(lenc,i);
        }
        z=0;
        for (int i=1;i<=lena||z!=0;i++)
        {
            c[i]=c[i]-z-a[i];
            if (c[i]<0) z=1;else z=0;
            c[i]=(c[i]+10)%10;
        }
        while (c[lenc]==0) lenc--;
        c[1]+=2;z=c[1]/10;c[1]%=10;
        for (int i=2;z!=0;i++)
        {
            c[i]+=z;
            z=c[i]/10;
            c[i]%=10;
        }
        for (int i=1;i<=lenb;i++)
        {
            a[i]=b[i];
        }
        for (int i=1;i<=lenc;i++)
        {
            b[i]=c[i];
        }
        lena=lenb;lenb=lenc;
    }
    for (int i=lenb;i>=1;i--)
    {
        printf("%d",b[i]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值