zoukankan      html  css  js  c++  java
  • 简单递推

    一、关于平面分割


    (1)直线分割
    题目大致如:n条直线,最多可以把平面分为多少个区域。
    公式:D(1)=2  D(n)=D(n-1)+n
     
    (2)折线分割
    公式:D(1)=2    D(n)=D(n-1)+4(n-1)+1
    /***
     * HDU 2050 折线分割
     ****/
    #include<cstdio>
    #include<cstring>

    #define MAXN 10010

    using namespace std;

    int n,num,arr[MAXN];

    int main()
    {
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
      {
        scanf("%d",&num);
        arr[1]=2;
        for(int i=2;i<=num;i++)
          arr[i]=arr[i-1]+4*(i-1)+1;
        printf("%d ",arr[num]);
      }
      return 0;
    }
     
    (3)封闭曲线分割平面
    题目大致如设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
    公式:D1=2   D(n)=D(n-1)+2(n-1)
     
     

    (4)Z行分割

    一个“Z”可以把平面分为2部分,两个“Z”可以把平面分为12部分,那么,现在的问题是:如果平面上有n个“Z”,平面最多可以分割为几部分?
    公式: D1=2  D(n)=D(n-1)+9n+5
     
     

    (5)三角形分割

    公式:D(1)=2  D(n)=D(n-1)+6(n-1)
    /***
     * HDU 1249 三角形分割 a[i]=a[i-1]+6(i-1)
     * ***/
    #include <cstdio>
    #include<cstring>

    #define MAX 10010

    using namespace std;

    int n,a[MAX];

    int main()
    {
      int t;
      scanf("%d",&t);
      while (t--)
      {
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        a[1]=2;
        for(int i=2;i<=n;i++)
          a[i]=a[i-1]+6*(i-1);
        printf("%d ",a[n]);
      }
      return 0;
    }
     
     

    (6) 分割空间

    /***
    *HDU 1290  切西瓜
    ***/
    #include<cstdio>
    #include<cstring>

    using namespace std;

    int n;

    int main()
    {
      while (scanf("%d",&n)!=EOF)
      {
          printf("%d ",(n*n*n+5*n+6)/6);
      }
      return 0;
    }

    总结:

    其实这类题目都有模板公式的,只许具体问题,您带入几个解去求出各个系数就可以了!

     一般二维的是 a*n^2 +b *n +c

    三维的是: a*n^3 + b* n^2 + c*n +d

    具体问题带定系数法求出各个系数就OK了,不用想破脑筋找规律。。。。。。

     
     

    二、错排公式

    当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
    第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
    第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
    综上得到
    D(n) = (n-1) [D(n-2) + D(n-1)]
    特殊地,D(1) = 0, D(2) = 1
    题目有HDU 2048 2049 1465   WIKIOI 1697
    /***
     * HDU 2049 错排
     * **/
    #include<cstdio>

    #define MAXN 25

    using namespace std;

    int n;
    __int64 a[MAXN];

    int main()
    {
      int t;
      __int64 tmp;
      scanf("%d",&t);
      while (t--)
      {
        scanf("%d",&n);
        tmp=2;

        a[1]=0;a[2]=1;
        for(int i=3;i<=n;i++)
        {
          tmp*=i;
          a[i]=(i-1)*(a[i-1]+a[i-2]);
        }
        printf("%.2f%% ",(a[n]*1.0/tmp)*100);
      }
      return 0;

    }

     

     
    /***
    * WIKIOI 1697 高精度+错排
    ***/
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<algorithm>
    using namespace std;

    #define MAXN 9999
    #define MAXSIZE 10
    #define DLEN 4


    class BigNum
    {
    private:
        int a[500];    //可以控制大数的位数
        int len;       //大数长度
    public:
        BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数
        BigNum(const int);       //将一个int类型的变量转化为大数
        BigNum(const char*);     //将一个字符串类型的变量转化为大数
        BigNum(const BigNum &);  //拷贝构造函数
        BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算

        friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
        friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符

        BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
        BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
        BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
        BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算

        BigNum operator^(const int  &) const;    //大数的n次方运算
        int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
        bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
        bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较

        void print();       //输出大数
    };


    BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
    {
        int c,d = b;
        len = 0;
        memset(a,0,sizeof(a));
        while(d > MAXN)
        {
            c = d - (d / (MAXN + 1)) * (MAXN + 1);
            d = d / (MAXN + 1);
            a[len++] = c;
        }
        a[len++] = d;
    }
    BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
    {
        int t,k,index,l,i;
        memset(a,0,sizeof(a));
        l=strlen(s);
        len=l/DLEN;
        if(l%DLEN)
            len++;
        index=0;
        for(i=l-1;i>=0;i-=DLEN)
        {
            t=0;
            k=i-DLEN+1;
            if(k<0)
                k=0;
            for(int j=k;j<=i;j++)
                t=t*10+s[j]-'0';
            a[index++]=t;
        }
    }
    BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
    {
        int i;
        memset(a,0,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = T.a[i];
    }
    BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
    {
        int i;
        len = n.len;
        memset(a,0,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = n.a[i];
        return *this;
    }
    istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符
    {
        char ch[MAXSIZE*4];
        int i = -1;
        in>>ch;
        int l=strlen(ch);
        int count=0,sum=0;
        for(i=l-1;i>=0;)
        {
            sum = 0;
            int t=1;
            for(int j=0;j<4&&i>=0;j++,i--,t*=10)
            {
                sum+=(ch[i]-'0')*t;
            }
            b.a[count]=sum;
            count++;
        }
        b.len =count++;
        return in;

    }
    ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
    {
        int i;
        cout << b.a[b.len - 1];
        for(i = b.len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << b.a[i];
        }
        return out;
    }

    BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
    {
        BigNum t(*this);
        int i,big;      //位数
        big = T.len > len ? T.len : len;
        for(i = 0 ; i < big ; i++)
        {
            t.a[i] +=T.a[i];
            if(t.a[i] > MAXN)
            {
                t.a[i + 1]++;
                t.a[i] -=MAXN+1;
            }
        }
        if(t.a[big] != 0)
            t.len = big + 1;
        else
            t.len = big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
    {
        int i,j,big;
        bool flag;
        BigNum t1,t2;
        if(*this>T)
        {
            t1=*this;
            t2=T;
            flag=0;
        }
        else
        {
            t1=T;
            t2=*this;
            flag=1;
        }
        big=t1.len;
        for(i = 0 ; i < big ; i++)
        {
            if(t1.a[i] < t2.a[i])
            {
                j = i + 1;
                while(t1.a[j] == 0)
                    j++;
                t1.a[j--]--;
                while(j > i)
                    t1.a[j--] += MAXN;
                t1.a[i] += MAXN + 1 - t2.a[i];
            }
            else
                t1.a[i] -= t2.a[i];
        }
        t1.len = big;
        while(t1.a[len - 1] == 0 && t1.len > 1)
        {
            t1.len--;
            big--;
        }
        if(flag)
            t1.a[big-1]=0-t1.a[big-1];
        return t1;
    }

    BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
    {
        BigNum ret;
        int i,j,up;
        int temp,temp1;
        for(i = 0 ; i < len ; i++)
        {
            up = 0;
            for(j = 0 ; j < T.len ; j++)
            {
                temp = a[i] * T.a[j] + ret.a[i + j] + up;
                if(temp > MAXN)
                {
                    temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
                    up = temp / (MAXN + 1);
                    ret.a[i + j] = temp1;
                }
                else
                {
                    up = 0;
                    ret.a[i + j] = temp;
                }
            }
            if(up != 0)
                ret.a[i + j] = up;
        }
        ret.len = i + j;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
    {
        BigNum ret;
        int i,down = 0;
        for(i = len - 1 ; i >= 0 ; i--)
        {
            ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
            down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
        }
        ret.len = len;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
    {
        int i,d=0;
        for (i = len-1; i>=0; i--)
        {
            d = ((d * (MAXN+1))% b + a[i])% b;
        }
        return d;
    }
    BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
    {
        BigNum t,ret(1);
        int i;
        if(n<0)
            exit(-1);
        if(n==0)
            return 1;
        if(n==1)
            return *this;
        int m=n;
        while(m>1)
        {
            t=*this;
            for( i=1;i<<1<=m;i<<=1)
            {
                t=t*t;
            }
            m-=i;
            ret=ret*t;
            if(m==1)
                ret=ret*(*this);
        }
        return ret;
    }
    bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
    {
        int ln;
        if(len > T.len)
            return true;
        else if(len == T.len)
        {
            ln = len - 1;
            while(a[ln] == T.a[ln] && ln >= 0)
                ln--;
            if(ln >= 0 && a[ln] > T.a[ln])
                return true;
            else
                return false;
        }
        else
            return false;
    }
    bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
    {
        BigNum b(t);
        return *this>b;
    }

    void BigNum::print()    //输出大数
    {
        int i;
        cout << a[len - 1];
        for(i = len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << a[i];
        }
        cout << endl;
    }


    int main()
    {
      int n;
      BigNum a[120];
      cin>>n;
      a[1]=0;
      for(int i=2;i<=n;i++)
      {
        if(i%2)
          a[i]=a[i-1]*(BigNum(i))-1;
        else
          a[i]=a[i-1]*(BigNum(i))+1;
      }
      a[n].print();
      return 0;
    }
     
     
     
     

    (3)斐波那契数列

    题目:HDU2018   HDU2041(爬楼梯)  HDU 2044
    /***
     * HDU 2018  斐波那契数列
     ***/

    #include<cstdio>
    #include<cstring>

    #define MAXN 60

    using namespace std;

    int n,a[MAXN];

    int main()
    {
      a[1]=1;a[2]=2;a[3]=3;a[4]=4;
      while (scanf("%d",&n)!=EOF)
      {
        if(!n) break;
        for(int i=5;i<=n;i++)
          a[i]=a[i-1]+a[i-3];
        printf("%d ",a[n]);
      }
      return 0;
    }
     
    /***
     * HDU 2041 爬楼梯
     */
    #include<cstdio>
    #include<cstring>

    #define MAXN 60

    using namespace std;

    int n,m;
    __int64 a[MAXN];

    int main()
    {
      scanf("%d",&n);
      a[1]=1;a[2]=1;
      for(int i=3;i<=MAXN;i++)
        a[i]=a[i-1]+a[i-2];
      while(n--)
      {
        scanf("%d",&m);
        printf("%I64d ",a[m]);
      }
      return 0;
    }
     
    /****
    *HDU 2044
    ***/
    #include<cstdio>

    #define MAXN 60

    using namespace std;

    int a,b;
    __int64 dp[MAXN];

    int main()
    {
      int t;
      scanf("%d",&t);
      while (t--)
      {
        scanf("%d%d",&a,&b);
        dp[a]=0;dp[a+1]=1;dp[a+2]=2;
        for(int i=a+3;i<=b;i++)
          dp[i]=dp[i-1]+dp[i-2];
        printf("%I64d ",dp[b]);
      }
      return 0;
    }
     
     

    (4)其他

    /***
    *HDU 1297  a[n]=a[n-1]+a[n-2]+a[n-4] 高精度
    ***/
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<algorithm>

    #define MAX 1010
    #define MAXN 9999
    #define MAXSIZE 10
    #define DLEN 4
    using namespace std;

    class BigNum
    {
    private:
        int a[500];    //可以控制大数的位数
        int len;       //大数长度
    public:
        BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数
        BigNum(const int);       //将一个int类型的变量转化为大数
        BigNum(const char*);     //将一个字符串类型的变量转化为大数
        BigNum(const BigNum &);  //拷贝构造函数
        BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算

        friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
        friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符

        BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
        BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
        BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
        BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算

        BigNum operator^(const int  &) const;    //大数的n次方运算
        int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
        bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
        bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较

        void print();       //输出大数
    };


    BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
    {
        int c,d = b;
        len = 0;
        memset(a,0,sizeof(a));
        while(d > MAXN)
        {
            c = d - (d / (MAXN + 1)) * (MAXN + 1);
            d = d / (MAXN + 1);
            a[len++] = c;
        }
        a[len++] = d;
    }
    BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
    {
        int t,k,index,l,i;
        memset(a,0,sizeof(a));
        l=strlen(s);
        len=l/DLEN;
        if(l%DLEN)
            len++;
        index=0;
        for(i=l-1;i>=0;i-=DLEN)
        {
            t=0;
            k=i-DLEN+1;
            if(k<0)
                k=0;
            for(int j=k;j<=i;j++)
                t=t*10+s[j]-'0';
            a[index++]=t;
        }
    }
    BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
    {
        int i;
        memset(a,0,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = T.a[i];
    }
    BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
    {
        int i;
        len = n.len;
        memset(a,0,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = n.a[i];
        return *this;
    }
    istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符
    {
        char ch[MAXSIZE*4];
        int i = -1;
        in>>ch;
        int l=strlen(ch);
        int count=0,sum=0;
        for(i=l-1;i>=0;)
        {
            sum = 0;
            int t=1;
            for(int j=0;j<4&&i>=0;j++,i--,t*=10)
            {
                sum+=(ch[i]-'0')*t;
            }
            b.a[count]=sum;
            count++;
        }
        b.len =count++;
        return in;

    }
    ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
    {
        int i;
        cout << b.a[b.len - 1];
        for(i = b.len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << b.a[i];
        }
        return out;
    }

    BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
    {
        BigNum t(*this);
        int i,big;      //位数
        big = T.len > len ? T.len : len;
        for(i = 0 ; i < big ; i++)
        {
            t.a[i] +=T.a[i];
            if(t.a[i] > MAXN)
            {
                t.a[i + 1]++;
                t.a[i] -=MAXN+1;
            }
        }
        if(t.a[big] != 0)
            t.len = big + 1;
        else
            t.len = big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
    {
        int i,j,big;
        bool flag;
        BigNum t1,t2;
        if(*this>T)
        {
            t1=*this;
            t2=T;
            flag=0;
        }
        else
        {
            t1=T;
            t2=*this;
            flag=1;
        }
        big=t1.len;
        for(i = 0 ; i < big ; i++)
        {
            if(t1.a[i] < t2.a[i])
            {
                j = i + 1;
                while(t1.a[j] == 0)
                    j++;
                t1.a[j--]--;
                while(j > i)
                    t1.a[j--] += MAXN;
                t1.a[i] += MAXN + 1 - t2.a[i];
            }
            else
                t1.a[i] -= t2.a[i];
        }
        t1.len = big;
        while(t1.a[len - 1] == 0 && t1.len > 1)
        {
            t1.len--;
            big--;
        }
        if(flag)
            t1.a[big-1]=0-t1.a[big-1];
        return t1;
    }

    BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
    {
        BigNum ret;
        int i,j,up;
        int temp,temp1;
        for(i = 0 ; i < len ; i++)
        {
            up = 0;
            for(j = 0 ; j < T.len ; j++)
            {
                temp = a[i] * T.a[j] + ret.a[i + j] + up;
                if(temp > MAXN)
                {
                    temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
                    up = temp / (MAXN + 1);
                    ret.a[i + j] = temp1;
                }
                else
                {
                    up = 0;
                    ret.a[i + j] = temp;
                }
            }
            if(up != 0)
                ret.a[i + j] = up;
        }
        ret.len = i + j;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
    {
        BigNum ret;
        int i,down = 0;
        for(i = len - 1 ; i >= 0 ; i--)
        {
            ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
            down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
        }
        ret.len = len;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
    {
        int i,d=0;
        for (i = len-1; i>=0; i--)
        {
            d = ((d * (MAXN+1))% b + a[i])% b;
        }
        return d;
    }
    BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
    {
        BigNum t,ret(1);
        int i;
        if(n<0)
            exit(-1);
        if(n==0)
            return 1;
        if(n==1)
            return *this;
        int m=n;
        while(m>1)
        {
            t=*this;
            for( i=1;i<<1<=m;i<<=1)
            {
                t=t*t;
            }
            m-=i;
            ret=ret*t;
            if(m==1)
                ret=ret*(*this);
        }
        return ret;
    }
    bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
    {
        int ln;
        if(len > T.len)
            return true;
        else if(len == T.len)
        {
            ln = len - 1;
            while(a[ln] == T.a[ln] && ln >= 0)
                ln--;
            if(ln >= 0 && a[ln] > T.a[ln])
                return true;
            else
                return false;
        }
        else
            return false;
    }
    bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
    {
        BigNum b(t);
        return *this>b;
    }

    void BigNum::print()    //输出大数
    {
        int i;
        cout << a[len - 1];
        for(i = len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << a[i];
        }
        cout << endl;
    }

    int n;
    BigNum a[MAX];


    int main()
    {
      while (cin>>n)
      {
        a[1]=1;a[2]=2;a[3]=4;a[4]=7;

        for(int i=5;i<=n;i++)
          a[i]=a[i-1]+a[i-2]+a[i-4];
        a[n].print();
      }
      return 0;
    }
     
    /***
    *HDU 2013 猴子吃桃问题
    ***/
    #include<cstdio>

    #define MAXN 35

    using namespace std;

    int n,a[MAXN];

    int main()
    {
      while (scanf("%d",&n)!=EOF)
      {
        a[1]=1;
        for(int i=2;i<=n;i++)
          a[i]=2*(a[i-1]+1);
        printf("%d ",a[n]);
      }
      return 0;
    }

    /***
    *HDU 2042 猴子吃桃问题
    ***/
    #include<cstdio>
    #include<cstring>

    #define MAXN 40

    using namespace std;

    int n,a[MAXN];

    int main()
    {
      int t;
      scanf("%d",&t);
      while (t--)
      {
        scanf("%d",&n);

        a[0]=3;
        for(int i=1;i<=n;i++)
          a[i]=2*a[i-1]-2;
        printf("%d ",a[n]);
      }
      return 0;
    }
     
    /****
     * HDU 2045  a[i]=a[i-1]+2*a[i-2]
     * ***/
    #include<cstdio>
    #include<cstring>

    #define MAXN 55

    using namespace std;

    int n;
    __int64 a[MAXN];

    int main()
    {
      a[1]=3;a[2]=6;a[3]=6;
      for(int i=4;i<=MAXN;i++)
        a[i]=a[i-1]+2*a[i-2];
      while (scanf("%d",&n)!=EOF)
      {
        printf("%I64d ",a[n]);
      }
      return 0;
    }

    /***
     * HDU 2047   a[i]=a[i-1]+a[i-2]
     * ***/
    #include<cstdio>
    #include<cstring>

    #define MAXN 60

    using namespace std;

    int n;
    __int64 a[MAXN];

    int main()
    {
      while (scanf("%d",&n)!=EOF)
      {
        a[1]=1;a[2]=2;
        for(int i=3;i<=n;i++)
          a[i]=a[i-1]+a[i-2];
        printf("%I64d ",a[n]);
      }
      return 0;
    }

    /***
     *HDU 2047  a[i]=(a[i-1]+a[i-2])*2
     */
    #include<cstdio>

    #define MAXN 50

    using namespace std;

    int n;
    __int64 a[MAXN];

    int main()
    {
      while (scanf("%d",&n)!=EOF)
      {
        a[1]=3;a[2]=8;
        for(int i=3;i<=n;i++)
          a[i]=(a[i-1]+a[i-2])*2;
        printf("%I64d ",a[n]);
      }
      return 0;
    }
     
     
     
  • 相关阅读:
    韦达定理+集合运算+整体运算
    最终评审及团队事后诸葛亮作业总结
    个人作业——软件评测
    团队作业第六次—软件著作权说明书
    团队第二次作业评分总结
    团队第一次作业评分总结
    团队作业第五次—项目冲刺
    团队作业第四次—项目系统设计与数据库设计
    结对第二次作业评测总结
    团队作业第一次—团队展示
  • 原文地址:https://www.cnblogs.com/gt123/p/3605321.html
Copyright © 2011-2022 走看看