【bzoj1002】[FJOI2007]轮状病毒

来源:互联网 发布:保险网络增员话术 编辑:程序博客网 时间:2024/05/01 04:06

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;}
0 0
原创粉丝点击