• [FJOI2007]轮状病毒(bzoj1002)(递推+高精度)


    传送门

    其实这道题是生成树的计数问题,可以用个什么Matrix-Tree定理

    然鹅我不会

    看了这篇博客

    打表找规律什么的真的是大佬!!!

    从别人那儿扒到递推式:f[i]=f[i-1]*3-f[i-2]+2

    因为会炸LL,所以用高精度。

    #include<bits/stdc++.h> 
    #define LL long long
    using namespace std;
    int read()
    {
        int f=1,x=0;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    struct bg{
        int w[101];
    }f[103];
    bg jian(bg a,bg b)
    {
        a.w[1]+=2;
        int j=1;
        while(a.w[j]>=10){a.w[j]%=10;a.w[j+1]++;j++;}
        for(int i=1;i<=a.w[0];++i)
        {
            a.w[i]-=b.w[i];
            if(a.w[i]<0)a.w[i]+=10,a.w[i+1]--;
        }
        while(a.w[a.w[0]]==0)a.w[0]--;
        return a;
    }
    bg mul(bg a,int k)
    {
        for(int i=1;i<=a.w[0];++i)
          a.w[i]*=k;
        for(int i=1;i<=a.w[0];++i)
        {
            a.w[i+1]+=a.w[i]/10;
            a.w[i]%=10;
        }
        while(a.w[a.w[0]+1]!=0)a.w[0]++;
        return a;
    }
    int main()
    {//f[i]=f[i-1]*3-f[i-2]+2 
        int n=read();
        if(n==1){printf("1
    ");return 0;}
        if(n==2){printf("5
    ");return 0;}
        if(n==3){printf("16
    ");return 0;}
        f[1].w[0]=f[2].w[0]=1;
        f[1].w[1]=1;f[2].w[1]=5;
        for(int i=3;i<=n;++i)
          f[i]=jian(mul(f[i-1],3),f[i-2]);
        for(int i=f[n].w[0];i>=1;--i)
          printf("%d",f[n].w[i]);
    }
    /*
    4
    2 3
    3 1
    6 1
    0 2
    */
    View Code
  • 相关阅读:
    css3 @page
    Python:GUI
    Python: simple drawings
    JQuery 实现多个checkbox 只选中一个
    pgwSlideshow.js
    Html5: Drawing with text
    HTML5 Video player jQuery plugin
    cSharp:反射 Reflection
    机器学习基础---无监督学习之异常检测
    机器学习作业---主成分分析PCA
  • 原文地址:https://www.cnblogs.com/yyys-/p/11436645.html
Copyright © 2020-2023  润新知