zoukankan      html  css  js  c++  java
  • bzoj1002[FJOI2007]轮状病毒

     给定n(N<=100),编程计算有多少个不同的n轮状病毒。

    Input

    第一行有1个正整数n。

    Output

    将编程计算出的不同的n轮状病毒数输出

    Sample Input

    3

    Sample Output

    16

    神dp。如果没看题解真心想不出来

    #include<stdio.h>
    #include<string.h>
    #define MAXD 110
    int N;
    struct BigInteger
    {
        char a[MAXD];
        const static int D = 100;
        void init(int n)
        {
            int i;
            for(i = 0; i < D; i ++)
            {
                a[i] = n % 10;
                n /= 10;
            }
        }
        BigInteger add(BigInteger &b)
        {
            int i, s, c;
            BigInteger ans;
            c = 0;
            for(i = 0; i < D; i ++)
            {
                s = a[i] + b.a[i] + c;
                ans.a[i] = s % 10;
                c = s / 10;
            }
            return ans;
        }
        BigInteger minus(BigInteger &b)
        {
            int i, s, c;
            BigInteger ans;
            c = 0;
            for(i = 0; i < D; i ++)
            {
                s = a[i] + c;
                if(s >= b.a[i])
                {
                    ans.a[i] = s - b.a[i];
                    c = 0;
                }
                else
                {
                    c = -1;
                    ans.a[i] = s + 10 - b.a[i];
                }
            }
            return ans;
        }
        void print()
        {
            int i;
            for(i = D - 1; i > 0 && a[i] == 0; i --);
            for(; i >= 0; i --)
                printf("%d", a[i]);
        }
    }f[MAXD], h[MAXD], g[MAXD];
    void init()
    {
        f[1].init(0), g[1].init(1), h[1].init(1);
        f[2].init(3), g[2].init(2), h[2].init(3);
    }
    void solve()
    {
        int i;
        for(i = 3; i <= N; i ++)
        {
            f[i] = f[i - 1].add(f[i - 1]).add(h[i - 1]).minus(h[i - 2]);
            g[i] = f[i - 1].add(g[i - 1]).add(h[i - 1]);
            h[i] = f[i - 1].add(h[i - 1]).add(h[i - 1]).minus(h[i - 2]);
        }
        f[N].add(g[N]).print();
        printf("
    ");
    }
    int main()
    {
        while(scanf("%d", &N) == 1)
        {
            init();
            solve();
        }
        return 0;
    }


    ——by zhber,转载请注明来源
  • 相关阅读:
    CF1324F Maximum White Subtree
    CF1204C Anna, Svyatoslav and Maps
    CF1187E Tree Painting
    CF1304E 1-Trees and Queries
    深入探究jvm之类装载器
    深入探究jvm之GC的算法及种类
    深入探究jvm之GC的参数调优
    spring源码解析之AOP原理
    spring注解扫描组件注册
    cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题
  • 原文地址:https://www.cnblogs.com/zhber/p/4036125.html
Copyright © 2011-2022 走看看