轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
现给定n(N<=100),编程计算有多少个不同的n轮状病毒
标签:
并不会推公式。。。网上也找不到推的方法?!?QAQ终于会写高精度~\(≧▽≦)/~啦啦啦
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(x,c,sizeof(x)) #define REP(i,s,t) for(int i=s;i<=t;i++) struct node{ int a[100];int len; }; node f[105]; node mly(node a,int x){ rep(i,a.len) a.a[i]*=x; rep(i,a.len) a.a[i+1]+=a.a[i]/10,a.a[i]%=10; if(a.a[a.len+1]) a.len++; return a; } node down(node a,node b){ rep(i,a.len) { a.a[i]-=b.a[i]; if(a.a[i]<0) a.a[i]+=10,a.a[i+1]--; } a.a[1]+=2;int cur=1; while(a.a[cur]>=10) a.a[cur]%=10,a.a[cur+1]++,cur++; while(!a.a[a.len]) a.len--; return a; } int main(){ int n;scanf("%d",&n); f[1].a[1]=1;f[2].a[1]=5;f[1].len=f[2].len=1; REP(i,3,n) f[i]=down(mly(f[i-1],3),f[i-2]); for(int i=f[n].len;i;i--) printf("%d",f[n].a[i]); return 0; }
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
第一行有1个正整数n
计算出的不同的n轮状病毒数输出
标签:
原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5671786.html