zoukankan      html  css  js  c++  java
  • BZOJ 1002

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1002

    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] imes 3 - f[i-2] + 2$。

    题解:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=105;
     
    struct BigInt
    {
        static const int maxdigit=100;
        int len,d[maxn];
     
        void clean(){while(len>1 && !d[len-1]) len--;}
        string str()const
        {
            string s;
            for(int i=0;i<len;i++) s+=d[len-1-i]+'0';
            return s;
        }
     
        BigInt(){memset(d,0,sizeof(d));len=1;}
        BigInt(int num){*this=num;}
        BigInt(char* num){*this=num;}
     
        bool operator<(const BigInt& oth)const
        {
            if(len!=oth.len) return len<oth.len;
            for(int i=len-1;i>=0;i--) if(d[i]!=oth.d[i]) return d[i]<oth.d[i];
            return false;
        }
        bool operator>(const BigInt& oth)const{return oth<*this;}
        bool operator<=(const BigInt& oth)const{return !(oth<*this);}
        bool operator>=(const BigInt& oth)const{return !(*this<oth);}
        bool operator!=(const BigInt& oth)const{return oth<*this || *this<oth;}
        bool operator==(const BigInt& oth)const{return !(oth<*this) && !(*this<oth);}
     
        BigInt operator=(const char* num)
        {
            memset(d,0,sizeof(d));
            len=strlen(num);
            for(int i=0;i<len;i++) d[i]=num[len-1-i]-'0';
            clean();
            return *this;
        }
        BigInt operator=(int num)
        {
            char s[20];
            sprintf(s,"%d",num);
            return *this=s;
        }
        BigInt operator+(const BigInt& oth)const
        {
            BigInt c;
            c.len=max(len,oth.len);
            for(int i=0;i<=c.len;i++) c.d[i]=0;
            for(int i=0;i<c.len;i++)
            {
                c.d[i]+=(i<len?d[i]:0)+(i<oth.len?oth.d[i]:0);
                c.d[i+1]+=c.d[i]/10;
                c.d[i]%=10;
            }
            c.len+=(c.d[c.len]>0);
            c.clean();
            return c;
        }
        BigInt operator-(const BigInt& oth)const
        {
            BigInt c=*this;
            if(c<oth) printf("Produce negative number!
    ");
            int i;
            for(i=0;i<oth.len;i++)
            {
                c.d[i]-=oth.d[i];
                if(c.d[i]<0) c.d[i]+=10, c.d[i+1]--;
            }
            while(c.d[i]<0) c.d[i++]+=10, c.d[i]--;
            c.clean();
            return c;
        }
        BigInt operator*(const BigInt& oth)const
        {
            BigInt c;
            for(int i=0;i<len;i++) for(int j=0;j<oth.len;j++) c.d[i+j]+=d[i]*oth.d[j];
            for(int i=0;i<len+oth.len || !c.d[i];c.len=++i) c.d[i+1]+=c.d[i]/10, c.d[i]%=10;
            c.clean();
            return c;
        }
        BigInt operator/(const BigInt& oth)const
        {
            BigInt c=*this, r=0;
            for(int i=0;i<len;i++)
            {
                r=r*10+c.d[len-1-i];
                int j;
                for(j=0;j<10;j++) if(r<oth*(j+1)) break;
                c.d[len-1-i]=j;
                r=r-oth*j;
            }
            c.clean();
            return c;
        }
        BigInt operator%(const BigInt& oth)
        {
            BigInt r=0;
            for(int i=0;i<len;i++)
            {
                r=r*10+d[len-1-i];
                int j;
                for(j=0;j<10;j++) if(r<oth*(j+1)) break;
                r=r-oth*j;
            }
            return r;
        }
        BigInt operator+=(const BigInt& oth)
        {
            *this=*this+oth;
            return *this;
        }
        BigInt operator*=(const BigInt& oth)
        {
            *this=*this*oth;
            return *this;
        }
        BigInt operator-=(const BigInt& oth)
        {
            *this=*this-oth;
            return *this;
        }
        BigInt operator/=(const BigInt& oth)
        {
            *this=*this/oth;
            return *this;
        }
    };
    istream& operator>>(istream& in, BigInt& x)
    {
        string s;
        in>>s;
        x=s.c_str();
        return in;
    }
    ostream& operator<<(ostream& out,const BigInt& x)
    {
        out<<x.str();
        return out;
    }
     
    int n;
    BigInt f[maxn];
    int main()
    {
        cin>>n;
        f[1]=1;
        f[2]=5;
        for(int i=3;i<=n;i++) f[i]=(f[i-1]*3-f[i-2]+2);
        cout<<f[n]<<endl;
    }
  • 相关阅读:
    【MySQL】根据JSON字段的内容检索查询数据
    【PHP】跑大批量数据脚本
    【Thinkphp】 CLI模式下接收参数的几种方式
    元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符
    python unicode、utf-8、gbk编码与解码展示
    python使用requests通过代理地址发送multipart/form-data报文数据
    python使用requests通过代理地址发送application/x-www-form-urlencoded报文数据
    python使用requests通过代理地址发送application/json报文数据
    python使用requests通过代理地址发送text/xml报文数据
    python使用requests通过代理地址发送text/plain报文数据
  • 原文地址:https://www.cnblogs.com/dilthey/p/9824576.html
Copyright © 2011-2022 走看看