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;
}