• pku2084 Game of Connections


    http://poj.org/problem?id=2084

    组合数学,Catalan数,高精度

      1 #include <stdio.h>
      2 #include <string>
      3 #include <iostream>
      4 
      5 using namespace std;
      6 
      7 const int ten[4] = {1, 10, 100, 1000};
      8 const int max1=1000;
      9 
     10 struct BigNumber{
     11     int d[max1];
     12     BigNumber(string s)
     13     {
     14         int len = s.size();
     15         d[0] = (len-1)/4+1;
     16         int i, j, k;
     17         for(i=1; i<max1; ++i) d[i] =0;
     18         for(i=len-1; i>=0; --i)
     19         {
     20             j = (len-i-1)/4+1;
     21             k = (len-i-1)%4;
     22             d[j]+=ten[k]*(s[i]-'0');
     23         }
     24         while(d[0]>1 && d[d[0]]==0) --d[0];
     25     }
     26     BigNumber()
     27     {
     28         *this = BigNumber(string("0"));
     29     }
     30     string toString()
     31     {
     32         string s("");
     33         int i, j, temp;
     34         for(i=3; i>=1; --i) if(d[d[0]]>=ten[i]) break;
     35         temp = d[d[0]];
     36         for(j=i; j>=0; --j)
     37         {
     38             s = s+(char)(temp/ten[j]+'0');
     39             temp %= ten[j];
     40         }
     41         for(i=d[0]-1; i>0; --i)
     42         {
     43             temp = d[i];
     44             for(j=3; j>=0; --j)
     45             {
     46                 s = s+(char)(temp/ten[j]+'0');
     47                 temp %= ten[j];
     48             }
     49         }
     50         return s;
     51     }
     52 }zero("0"), d, temp, mid1[15];
     53 
     54 BigNumber operator + (const BigNumber &a, const BigNumber &b){
     55     BigNumber c;
     56     c.d[0] = max(a.d[0], b.d[0]);
     57     int i, x=0;
     58     for(i=1; i<=c.d[0]; ++i)
     59     {
     60         x = a.d[i]+b.d[i] +x;
     61         c.d[i]=x%10000;
     62         x/=10000;
     63     }
     64     while(x!=0)
     65     {
     66         c.d[++c.d[0]] = x%10000;
     67         x/=10000;
     68     }
     69     return c;
     70 }
     71 
     72 BigNumber operator *(const BigNumber &a, const BigNumber &b){
     73     BigNumber c;
     74     c.d[0] = a.d[0] + b.d[0];
     75     int i, j, x;
     76     for(i=1; i<=a.d[0]; ++i)
     77     {
     78         x= 0;
     79         for(j=1; j<=b.d[0]; ++j)
     80         {
     81             x = a.d[i]*b.d[j]+x+c.d[i+j-1];
     82             c.d[i+j-1] = x%10000;
     83             x /= 10000;
     84         }
     85         c.d[i+b.d[0]] = x;
     86     }
     87     while((c.d[0]>1) && (c.d[c.d[0]]==0)) --c.d[0];
     88     return c;
     89 }
     90 
     91 int main()
     92 {
     93     BigNumber one("1"), h[103];
     94     int i, j, n;
     95     h[0] = one;
     96     h[1] = one;
     97     for(n=2; n<=100; n++)
     98     {
     99         BigNumber sum("0");
    100         for(i=0; i<=n-1; i++)
    101         {
    102             sum = sum + (h[i] * h[n-i-1]);
    103         }
    104         h[n] = sum;
    105     }
    106     while(cin>>i, i+1)
    107     {
    108         cout<<h[i].toString()<<endl;
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    基于最大最小距离的分类数目上限K确定的聚类方法
    diff函数(matlab)
    CreateThread线程函数
    套接字基础
    基于TCP套接字实现的简单Demo
    使用httpwatch抓包
    TLV----Demo讲解
    关于位图边缘的检测定位
    从txt中读入数据到数组中(fscanf)
    C语言运算符的优先级
  • 原文地址:https://www.cnblogs.com/yuan1991/p/pku2084.html
Copyright © 2020-2023  润新知