BZOJ1002轮状病毒

来源:互联网 发布:宁波软件行业协会 编辑:程序博客网 时间:2024/05/01 06:09

[BZOJ1002]FJOI2007轮状病毒
不会啊,结论题。。。

目录

      • 结论
      • 代码

结论

由周冬2007年集训队论文的一些神奇理论可知,i个点的生成树个数的递推式为dp[i]=3dp[i1]dp[i2]+2,所以乱搞个高精就好了。。。

代码

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using std::max;using std::cout;using std::ostream;using std::memset;const int MAXN=105;int n;class bigNum{    private:        int c[MAXN];    public:        bigNum(){memset(c,0,sizeof(c));}        void init(int len,int x){            c[0]=len,c[1]=x;        }        friend bigNum operator+ (const bigNum &a,const int b){            bigNum c;            c.c[1]=b;            for(int i=1;i<=a.c[0];++i){                c.c[i]+=a.c[i];                c.c[i+1]+=c.c[i]/10;                c.c[i]%=10;            }            c.c[0]=a.c[0];            if(c.c[c.c[0]]>9){                c.c[c.c[0]+1]+=c.c[c.c[0]]/10;                c.c[c.c[0]]%=10;                ++c.c[0];            }            return c;        }        friend bigNum operator- (const bigNum &a,const bigNum &b){            bigNum c;            for(int i=1;i<=a.c[0];++i){                c.c[i]+=a.c[i]-b.c[i];                if(c.c[i]<0){                    c.c[i]+=10;                    --c.c[i+1];                }            }            c.c[0]=a.c[0];            while(c.c[c.c[0]]==0) --c.c[0];            return c;        }        friend bigNum operator* (const bigNum &a,const int b){            bigNum c;            for(int i=a.c[0];i;--i){                c.c[i]=a.c[i]*b;                c.c[i+1]+=c.c[i]/10;                c.c[i]%=10;            }            c.c[0]=a.c[0];            while(c.c[c.c[0]]>9){                c.c[c.c[0]+1]+=c.c[c.c[0]]/10;                c.c[c.c[0]]%=10;                ++c.c[0];            }            while(c.c[c.c[0]+1]) ++c.c[0];            return c;        }        friend ostream& operator<< (ostream &out,const bigNum &a){            for(int i=a.c[0];i;--i)                putchar(a.c[i]|'0');            return out;        }}dp[MAXN];int main(){    scanf("%d",&n);    dp[1].init(1,1);    dp[2].init(1,5);    for(int i=3;i<=n;++i)        dp[i]=dp[i-1]*3-dp[i-2]+2;    cout<<dp[n];    return 0;}