zoukankan      html  css  js  c++  java
  • hdu 5429 Geometric Progression(存个大数模板)

    Problem Description
    Determine whether a sequence is a Geometric progression or not.
    
    In mathematics, a **geometric progression**, also known as a **geometric sequence**, is a sequence of numbers where each term after the first is found by multiplying the previous one by a fixed, non-zero number called the common ratio. For example, the sequence 2, 6, 18, 54, ... is a geometric progression with common ratio 3. Similarly 10, 5, 2.5, 1.25, ... is a geometric sequence with common ratio 1/2.
    
    Examples of a geometric sequence are powers rk of a fixed number r, such as 2k and 3k. The general form of a geometric sequence is
    
    a, ar, ar2, ar3, ar4, …
    
    where r ≠ 0 is the common ratio and a is a scale factor, equal to the sequence's start value.
     
    Input
    First line contains a single integer T(T≤20) which denotes the number of test cases. 
    
    For each test case, there is an positive integer n(1≤n≤100) which denotes the length of sequence,and next line has n nonnegative numbers Ai which allow leading zero.The digit's length of Ai no larger than 100.
     
    Output
    For each case, output "Yes" or "No".
     
    Sample Input
    4 
    1 
    0 
    3 
    1 1 1 
    3 
    1 4 2 
    5 
    16 8 4 2 1
     
    Sample Output
    Yes 
    Yes 
    No 
    Yes
     
    Source
     

    判定一个序列是否是等比数列。

    坑点:

    首项可以是0,此时其余项必须全为0才是等比数列

     

    扒了个比较好用的大数模板,几乎可以和int一样使用。

      1 #include <iostream>
      2 #include <cstring>
      3 using namespace std;
      4 
      5 #define DIGIT   4      //四位隔开,即万进制
      6 #define DEPTH   10000        //万进制
      7 #define MAX     251    //题目最大位数/4,要不大直接设为最大位数也行
      8 typedef int bignum_t[MAX+1];
      9 
     10 /************************************************************************/
     11 /* 读取操作数,对操作数进行处理存储在数组里                             */
     12 /************************************************************************/
     13 int read(bignum_t a,istream&is=cin)
     14 {
     15     char buf[MAX*DIGIT+1],ch ;
     16     int i,j ;
     17     memset((void*)a,0,sizeof(bignum_t));
     18     if(!(is>>buf))return 0 ;
     19     for(a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
     20     ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ;
     21     for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
     22     for(i=1;i<=a[0];i++)
     23     for(a[i]=0,j=0;j<DIGIT;j++)
     24     a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ;
     25     for(;!a[a[0]]&&a[0]>1;a[0]--);
     26     return 1 ;
     27 }
     28 
     29 void write(const bignum_t a,ostream&os=cout)
     30 {
     31     int i,j ;
     32     for(os<<a[i=a[0]],i--;i;i--)
     33     for(j=DEPTH/10;j;j/=10)
     34     os<<a[i]/j%10 ;
     35 }
     36 
     37 int comp(const bignum_t a,const bignum_t b)
     38 {
     39     int i ;
     40     if(a[0]!=b[0])
     41     return a[0]-b[0];
     42     for(i=a[0];i;i--)
     43     if(a[i]!=b[i])
     44     return a[i]-b[i];
     45     return 0 ;
     46 }
     47 
     48 int comp(const bignum_t a,const int b)
     49 {
     50     int c[12]=
     51     {
     52         1
     53     }
     54     ;
     55     for(c[1]=b;c[c[0]]>=DEPTH;c[c[0]+1]=c[c[0]]/DEPTH,c[c[0]]%=DEPTH,c[0]++);
     56     return comp(a,c);
     57 }
     58 
     59 int comp(const bignum_t a,const int c,const int d,const bignum_t b)
     60 {
     61     int i,t=0,O=-DEPTH*2 ;
     62     if(b[0]-a[0]<d&&c)
     63     return 1 ;
     64     for(i=b[0];i>d;i--)
     65     {
     66         t=t*DEPTH+a[i-d]*c-b[i];
     67         if(t>0)return 1 ;
     68         if(t<O)return 0 ;
     69     }
     70     for(i=d;i;i--)
     71     {
     72         t=t*DEPTH-b[i];
     73         if(t>0)return 1 ;
     74         if(t<O)return 0 ;
     75     }
     76     return t>0 ;
     77 }
     78 /************************************************************************/
     79 /* 大数与大数相加                                                       */
     80 /************************************************************************/
     81 void add(bignum_t a,const bignum_t b)
     82 {
     83     int i ;
     84     for(i=1;i<=b[0];i++)
     85     if((a[i]+=b[i])>=DEPTH)
     86     a[i]-=DEPTH,a[i+1]++;
     87     if(b[0]>=a[0])
     88     a[0]=b[0];
     89     else
     90     for(;a[i]>=DEPTH&&i<a[0];a[i]-=DEPTH,i++,a[i]++);
     91     a[0]+=(a[a[0]+1]>0);
     92 }
     93 /************************************************************************/
     94 /* 大数与小数相加                                                       */
     95 /************************************************************************/
     96 void add(bignum_t a,const int b)
     97 {
     98     int i=1 ;
     99     for(a[1]+=b;a[i]>=DEPTH&&i<a[0];a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++);
    100     for(;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
    101 }
    102 /************************************************************************/
    103 /* 大数相减(被减数>=减数)                                               */
    104 /************************************************************************/
    105 void sub(bignum_t a,const bignum_t b)
    106 {
    107     int i ;
    108     for(i=1;i<=b[0];i++)
    109     if((a[i]-=b[i])<0)
    110     a[i+1]--,a[i]+=DEPTH ;
    111     for(;a[i]<0;a[i]+=DEPTH,i++,a[i]--);
    112     for(;!a[a[0]]&&a[0]>1;a[0]--);
    113 }
    114 /************************************************************************/
    115 /* 大数减去小数(被减数>=减数)                                           */
    116 /************************************************************************/
    117 void sub(bignum_t a,const int b)
    118 {
    119     int i=1 ;
    120     for(a[1]-=b;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
    121     for(;!a[a[0]]&&a[0]>1;a[0]--);
    122 }
    123 
    124 void sub(bignum_t a,const bignum_t b,const int c,const int d)
    125 {
    126     int i,O=b[0]+d ;
    127     for(i=1+d;i<=O;i++)
    128     if((a[i]-=b[i-d]*c)<0)
    129     a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH ;
    130     for(;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
    131     for(;!a[a[0]]&&a[0]>1;a[0]--);
    132 }
    133 /************************************************************************/
    134 /* 大数相乘,读入被乘数a,乘数b,结果保存在c[]                          */
    135 /************************************************************************/
    136 void mul(bignum_t c,const bignum_t a,const bignum_t b)
    137 {
    138     int i,j ;
    139     memset((void*)c,0,sizeof(bignum_t));
    140     for(c[0]=a[0]+b[0]-1,i=1;i<=a[0];i++)
    141     for(j=1;j<=b[0];j++)
    142     if((c[i+j-1]+=a[i]*b[j])>=DEPTH)
    143     c[i+j]+=c[i+j-1]/DEPTH,c[i+j-1]%=DEPTH ;
    144     for(c[0]+=(c[c[0]+1]>0);!c[c[0]]&&c[0]>1;c[0]--);
    145 }
    146 /************************************************************************/
    147 /* 大数乘以小数,读入被乘数a,乘数b,结果保存在被乘数                   */
    148 /************************************************************************/
    149 void mul(bignum_t a,const int b)
    150 {
    151     int i ;
    152     for(a[1]*=b,i=2;i<=a[0];i++)
    153     {
    154         a[i]*=b ;
    155         if(a[i-1]>=DEPTH)
    156         a[i]+=a[i-1]/DEPTH,a[i-1]%=DEPTH ;
    157     }
    158     for(;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
    159     for(;!a[a[0]]&&a[0]>1;a[0]--);
    160 }
    161 
    162 void mul(bignum_t b,const bignum_t a,const int c,const int d)
    163 {
    164     int i ;
    165     memset((void*)b,0,sizeof(bignum_t));
    166     for(b[0]=a[0]+d,i=d+1;i<=b[0];i++)
    167     if((b[i]+=a[i-d]*c)>=DEPTH)
    168     b[i+1]+=b[i]/DEPTH,b[i]%=DEPTH ;
    169     for(;b[b[0]+1];b[0]++,b[b[0]+1]=b[b[0]]/DEPTH,b[b[0]]%=DEPTH);
    170     for(;!b[b[0]]&&b[0]>1;b[0]--);
    171 }
    172 /**************************************************************************/
    173 /* 大数相除,读入被除数a,除数b,结果保存在c[]数组                         */
    174 /* 需要comp()函数                                                         */
    175 /**************************************************************************/
    176 void div(bignum_t c,bignum_t a,const bignum_t b)
    177 {
    178     int h,l,m,i ;
    179     memset((void*)c,0,sizeof(bignum_t));
    180     c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1 ;
    181     for(i=c[0];i;sub(a,b,c[i]=m,i-1),i--)
    182     for(h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)
    183     if(comp(b,m,i-1,a))h=m-1 ;
    184     else l=m ;
    185     for(;!c[c[0]]&&c[0]>1;c[0]--);
    186     c[0]=c[0]>1?c[0]:1 ;
    187 }
    188 
    189 void div(bignum_t a,const int b,int&c)
    190 {
    191     int i ;
    192     for(c=0,i=a[0];i;c=c*DEPTH+a[i],a[i]=c/b,c%=b,i--);
    193     for(;!a[a[0]]&&a[0]>1;a[0]--);
    194 }
    195 /************************************************************************/
    196 /* 大数平方根,读入大数a,结果保存在b[]数组里                           */
    197 /* 需要comp()函数                                                       */
    198 /************************************************************************/
    199 void sqrt(bignum_t b,bignum_t a)
    200 {
    201     int h,l,m,i ;
    202     memset((void*)b,0,sizeof(bignum_t));
    203     for(i=b[0]=(a[0]+1)>>1;i;sub(a,b,m,i-1),b[i]+=m,i--)
    204     for(h=DEPTH-1,l=0,b[i]=m=(h+l+1)>>1;h>l;b[i]=m=(h+l+1)>>1)
    205     if(comp(b,m,i-1,a))h=m-1 ;
    206     else l=m ;
    207     for(;!b[b[0]]&&b[0]>1;b[0]--);
    208     for(i=1;i<=b[0];b[i++]>>=1);
    209 }
    210 /************************************************************************/
    211 /* 返回大数的长度                                                       */
    212 /************************************************************************/
    213 int length(const bignum_t a)
    214 {
    215     int t,ret ;
    216     for(ret=(a[0]-1)*DIGIT,t=a[a[0]];t;t/=10,ret++);
    217     return ret>0?ret:1 ;
    218 }
    219 /************************************************************************/
    220 /* 返回指定位置的数字,从低位开始数到第b位,返回b位上的数               */
    221 /************************************************************************/
    222 int digit(const bignum_t a,const int b)
    223 {
    224     int i,ret ;
    225     for(ret=a[(b-1)/DIGIT+1],i=(b-1)%DIGIT;i;ret/=10,i--);
    226     return ret%10 ;
    227 }
    228 /************************************************************************/
    229 /* 返回大数末尾0的个数                                                  */
    230 /************************************************************************/
    231 int zeronum(const bignum_t a)
    232 {
    233     int ret,t ;
    234     for(ret=0;!a[ret+1];ret++);
    235     for(t=a[ret+1],ret*=DIGIT;!(t%10);t/=10,ret++);
    236     return ret ;
    237 }
    238 
    239 void comp(int*a,const int l,const int h,const int d)
    240 {
    241     int i,j,t ;
    242     for(i=l;i<=h;i++)
    243     for(t=i,j=2;t>1;j++)
    244     while(!(t%j))
    245     a[j]+=d,t/=j ;
    246 }
    247 
    248 void convert(int*a,const int h,bignum_t b)
    249 {
    250     int i,j,t=1 ;
    251     memset(b,0,sizeof(bignum_t));
    252     for(b[0]=b[1]=1,i=2;i<=h;i++)
    253     if(a[i])
    254     for(j=a[i];j;t*=i,j--)
    255     if(t*i>DEPTH)
    256     mul(b,t),t=1 ;
    257     mul(b,t);
    258 }
    259 /************************************************************************/
    260 /* 组合数                                                               */
    261 /************************************************************************/
    262 void combination(bignum_t a,int m,int n)
    263 {
    264     int*t=new int[m+1];
    265     memset((void*)t,0,sizeof(int)*(m+1));
    266     comp(t,n+1,m,1);
    267     comp(t,2,m-n,-1);
    268     convert(t,m,a);
    269     delete[]t ;
    270 }
    271 /************************************************************************/
    272 /* 排列数                                                               */
    273 /************************************************************************/
    274 void permutation(bignum_t a,int m,int n)
    275 {
    276     int i,t=1 ;
    277     memset(a,0,sizeof(bignum_t));
    278     a[0]=a[1]=1 ;
    279     for(i=m-n+1;i<=m;t*=i++)
    280     if(t*i>DEPTH)
    281     mul(a,t),t=1 ;
    282     mul(a,t);
    283 }
    284 
    285 #define SGN(x) ((x)>0?1:((x)<0?-1:0))
    286 #define ABS(x) ((x)>0?(x):-(x))
    287 
    288 int read(bignum_t a,int&sgn,istream&is=cin)
    289 {
    290     char str[MAX*DIGIT+2],ch,*buf ;
    291     int i,j ;
    292     memset((void*)a,0,sizeof(bignum_t));
    293     if(!(is>>str))return 0 ;
    294     buf=str,sgn=1 ;
    295     if(*buf=='-')sgn=-1,buf++;
    296     for(a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
    297     ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ;
    298     for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
    299     for(i=1;i<=a[0];i++)
    300     for(a[i]=0,j=0;j<DIGIT;j++)
    301     a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ;
    302     for(;!a[a[0]]&&a[0]>1;a[0]--);
    303     if(a[0]==1&&!a[1])sgn=0 ;
    304     return 1 ;
    305 }
    306 struct bignum
    307 {
    308     bignum_t num ;
    309     int sgn ;
    310     public :
    311     inline bignum()
    312     {
    313         memset(num,0,sizeof(bignum_t));
    314         num[0]=1 ;
    315         sgn=0 ;
    316     }
    317     inline int operator!()
    318     {
    319         return num[0]==1&&!num[1];
    320     }
    321     inline bignum&operator=(const bignum&a)
    322     {
    323         memcpy(num,a.num,sizeof(bignum_t));
    324         sgn=a.sgn ;
    325         return*this ;
    326     }
    327     inline bignum&operator=(const int a)
    328     {
    329         memset(num,0,sizeof(bignum_t));
    330         num[0]=1 ;
    331         sgn=SGN (a);
    332         add(num,sgn*a);
    333         return*this ;
    334     }
    335     ;
    336     inline bignum&operator+=(const bignum&a)
    337     {
    338         if(sgn==a.sgn)add(num,a.num);
    339         else if
    340         (sgn&&a.sgn)
    341         {
    342             int ret=comp(num,a.num);
    343             if(ret>0)sub(num,a.num);
    344             else if(ret<0)
    345             {
    346                 bignum_t t ;
    347                 memcpy(t,num,sizeof(bignum_t));
    348                 memcpy(num,a.num,sizeof(bignum_t));
    349                 sub (num,t);
    350                 sgn=a.sgn ;
    351             }
    352             else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
    353         }
    354         else if(!sgn)
    355             memcpy(num,a.num,sizeof(bignum_t)),sgn=a.sgn ;
    356         return*this ;
    357     }
    358     inline bignum&operator+=(const int a)
    359     {
    360         if(sgn*a>0)add(num,ABS(a));
    361         else if(sgn&&a)
    362         {
    363             int  ret=comp(num,ABS(a));
    364             if(ret>0)sub(num,ABS(a));
    365             else if(ret<0)
    366             {
    367                 bignum_t t ;
    368                 memcpy(t,num,sizeof(bignum_t));
    369                 memset(num,0,sizeof(bignum_t));
    370                 num[0]=1 ;
    371                 add(num,ABS (a));
    372                 sgn=-sgn ;
    373                 sub(num,t);
    374             }
    375             else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
    376         }
    377         else if
    378             (!sgn)sgn=SGN(a),add(num,ABS(a));
    379         return*this ;
    380     }
    381     inline bignum operator+(const bignum&a)
    382     {
    383         bignum ret ;
    384         memcpy(ret.num,num,sizeof (bignum_t));
    385         ret.sgn=sgn ;
    386         ret+=a ;
    387         return ret ;
    388     }
    389     inline bignum operator+(const int a)
    390     {
    391         bignum ret ;
    392         memcpy(ret.num,num,sizeof (bignum_t));
    393         ret.sgn=sgn ;
    394         ret+=a ;
    395         return ret ;
    396     }
    397     inline bignum&operator-=(const bignum&a)
    398     {
    399         if(sgn*a.sgn<0)add(num,a.num);
    400         else if
    401         (sgn&&a.sgn)
    402         {
    403             int ret=comp(num,a.num);
    404             if(ret>0)sub(num,a.num);
    405             else if(ret<0)
    406             {
    407                 bignum_t t ;
    408                 memcpy(t,num,sizeof(bignum_t));
    409                 memcpy(num,a.num,sizeof(bignum_t));
    410                 sub(num,t);
    411                 sgn=-sgn ;
    412             }
    413             else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
    414         }
    415         else if(!sgn)add (num,a.num),sgn=-a.sgn ;
    416         return*this ;
    417     }
    418     inline bignum&operator-=(const int a)
    419     {
    420         if(sgn*a<0)add(num,ABS(a));
    421         else if(sgn&&a)
    422         {
    423             int  ret=comp(num,ABS(a));
    424             if(ret>0)sub(num,ABS(a));
    425             else if(ret<0)
    426             {
    427                 bignum_t t ;
    428                 memcpy(t,num,sizeof(bignum_t));
    429                 memset(num,0,sizeof(bignum_t));
    430                 num[0]=1 ;
    431                 add(num,ABS(a));
    432                 sub(num,t);
    433                 sgn=-sgn ;
    434             }
    435             else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ;
    436         }
    437         else if
    438             (!sgn)sgn=-SGN(a),add(num,ABS(a));
    439         return*this ;
    440     }
    441     inline bignum operator-(const bignum&a)
    442     {
    443         bignum ret ;
    444         memcpy(ret.num,num,sizeof(bignum_t));
    445         ret.sgn=sgn ;
    446         ret-=a ;
    447         return ret ;
    448     }
    449     inline bignum operator-(const int a)
    450     {
    451         bignum ret ;
    452         memcpy(ret.num,num,sizeof(bignum_t));
    453         ret.sgn=sgn ;
    454         ret-=a ;
    455         return ret ;
    456     }
    457     inline bignum&operator*=(const bignum&a)
    458     {
    459         bignum_t t ;
    460         mul(t,num,a.num);
    461         memcpy(num,t,sizeof(bignum_t));
    462         sgn*=a.sgn ;
    463         return*this ;
    464     }
    465     inline bignum&operator*=(const int a)
    466     {
    467         mul(num,ABS(a));
    468         sgn*=SGN(a);
    469         return*this ;
    470     }
    471     inline bignum operator*(const bignum&a)
    472     {
    473         bignum ret ;
    474         mul(ret.num,num,a.num);
    475         ret.sgn=sgn*a.sgn ;
    476         return ret ;
    477     }
    478     inline bignum operator*(const int a)
    479     {
    480         bignum ret ;
    481         memcpy(ret.num,num,sizeof (bignum_t));
    482         mul(ret.num,ABS(a));
    483         ret.sgn=sgn*SGN(a);
    484         return ret ;
    485     }
    486     inline bignum&operator/=(const bignum&a)
    487     {
    488         bignum_t t ;
    489         div(t,num,a.num);
    490         memcpy (num,t,sizeof(bignum_t));
    491         sgn=(num[0]==1&&!num[1])?0:sgn*a.sgn ;
    492         return*this ;
    493     }
    494     inline bignum&operator/=(const int a)
    495     {
    496         int t ;
    497         div(num,ABS(a),t);
    498         sgn=(num[0]==1&&!num [1])?0:sgn*SGN(a);
    499         return*this ;
    500     }
    501     inline bignum operator/(const bignum&a)
    502     {
    503         bignum ret ;
    504         bignum_t t ;
    505         memcpy(t,num,sizeof(bignum_t));
    506         div(ret.num,t,a.num);
    507         ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*a.sgn ;
    508         return ret ;
    509     }
    510     inline bignum operator/(const int a)
    511     {
    512         bignum ret ;
    513         int t ;
    514         memcpy(ret.num,num,sizeof(bignum_t));
    515         div(ret.num,ABS(a),t);
    516         ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*SGN(a);
    517         return ret ;
    518     }
    519     inline bignum&operator%=(const bignum&a)
    520     {
    521         bignum_t t ;
    522         div(t,num,a.num);
    523         if(num[0]==1&&!num[1])sgn=0 ;
    524         return*this ;
    525     }
    526     inline int operator%=(const int a)
    527     {
    528         int t ;
    529         div(num,ABS(a),t);
    530         memset(num,0,sizeof (bignum_t));
    531         num[0]=1 ;
    532         add(num,t);
    533         return t ;
    534     }
    535     inline bignum operator%(const bignum&a)
    536     {
    537         bignum ret ;
    538         bignum_t t ;
    539         memcpy(ret.num,num,sizeof(bignum_t));
    540         div(t,ret.num,a.num);
    541         ret.sgn=(ret.num[0]==1&&!ret.num [1])?0:sgn ;
    542         return ret ;
    543     }
    544     inline int operator%(const int a)
    545     {
    546         bignum ret ;
    547         int t ;
    548         memcpy(ret.num,num,sizeof(bignum_t));
    549         div(ret.num,ABS(a),t);
    550         memset(ret.num,0,sizeof(bignum_t));
    551         ret.num[0]=1 ;
    552         add(ret.num,t);
    553         return t ;
    554     }
    555     inline bignum&operator++()
    556     {
    557         *this+=1 ;
    558         return*this ;
    559     }
    560     inline bignum&operator--()
    561     {
    562         *this-=1 ;
    563         return*this ;
    564     }
    565     ;
    566     inline int operator>(const bignum&a)
    567     {
    568         return sgn>0?(a.sgn>0?comp(num,a.num)>0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<0:0):a.sgn<0);
    569     }
    570     inline int operator>(const int a)
    571     {
    572         return sgn>0?(a>0?comp(num,a)>0:1):(sgn<0?(a<0?comp(num,-a)<0:0):a<0);
    573     }
    574     inline int operator>=(const bignum&a)
    575     {
    576         return sgn>0?(a.sgn>0?comp(num,a.num)>=0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<=0:0):a.sgn<=0);
    577     }
    578     inline int operator>=(const int a)
    579     {
    580         return sgn>0?(a>0?comp(num,a)>=0:1):(sgn<0?(a<0?comp(num,-a)<=0:0):a<=0);
    581     }
    582     inline int operator<(const bignum&a)
    583     {
    584         return sgn<0?(a.sgn<0?comp(num,a.num)>0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<0:0):a.sgn>0);
    585     }
    586     inline int operator<(const int a)
    587     {
    588         return sgn<0?(a<0?comp(num,-a)>0:1):(sgn>0?(a>0?comp(num,a)<0:0):a>0);
    589     }
    590     inline int operator<=(const bignum&a)
    591     {
    592         return sgn<0?(a.sgn<0?comp(num,a.num)>=0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<=0:0):a.sgn>=0);
    593     }
    594     inline int operator<=(const int a)
    595     {
    596         return sgn<0?(a<0?comp(num,-a)>=0:1):
    597         (sgn>0?(a>0?comp(num,a)<=0:0):a>=0);
    598     }
    599     inline int operator==(const bignum&a)
    600     {
    601         return(sgn==a.sgn)?!comp(num,a.num):0 ;
    602     }
    603     inline int operator==(const int a)
    604     {
    605         return(sgn*a>=0)?!comp(num,ABS(a)):0 ;
    606     }
    607     inline int operator!=(const bignum&a)
    608     {
    609         return(sgn==a.sgn)?comp(num,a.num):1 ;
    610     }
    611     inline int operator!=(const int a)
    612     {
    613         return(sgn*a>=0)?comp(num,ABS(a)):1 ;
    614     }
    615     inline int operator[](const int a)
    616     {
    617         return digit(num,a);
    618     }
    619     friend inline istream&operator>>(istream&is,bignum&a)
    620     {
    621         read(a.num,a.sgn,is);
    622         return  is ;
    623     }
    624     friend inline ostream&operator<<(ostream&os,const bignum&a)
    625     {
    626         if(a.sgn<0)
    627             os<<'-' ;
    628         write(a.num,os);
    629         return os ;
    630     }
    631     friend inline bignum sqrt(const bignum&a)
    632     {
    633         bignum ret ;
    634         bignum_t t ;
    635         memcpy(t,a.num,sizeof(bignum_t));
    636         sqrt(ret.num,t);
    637         ret.sgn=ret.num[0]!=1||ret.num[1];
    638         return ret ;
    639     }
    640     friend inline bignum sqrt(const bignum&a,bignum&b)
    641     {
    642         bignum ret ;
    643         memcpy(b.num,a.num,sizeof(bignum_t));
    644         sqrt(ret.num,b.num);
    645         ret.sgn=ret.num[0]!=1||ret.num[1];
    646         b.sgn=b.num[0]!=1||ret.num[1];
    647         return ret ;
    648     }
    649     inline int length()
    650     {
    651         return :: length(num);
    652     }
    653     inline int zeronum()
    654     {
    655         return :: zeronum(num);
    656     }
    657     inline bignum C(const int m,const int n)
    658     {
    659         combination(num,m,n);
    660         sgn=1 ;
    661         return*this ;
    662     }
    663     inline bignum P(const int m,const int n)
    664     {
    665         permutation(num,m,n);
    666         sgn=1 ;
    667         return*this ;
    668     }
    669 };
    670 bignum a[105],zero;
    671 int main()
    672 {
    673     int i,t,n;
    674     zero=0;
    675     cin>>t;
    676     while(t--)
    677     {
    678         cin>>n;
    679         int cnt=0;
    680         for(i=0;i<n;++i) 
    681         {
    682             cin>>a[i];
    683             if(a[i]==zero) ++cnt;
    684         }
    685         if(cnt&&cnt!=n) cout<<"No"<<endl;
    686         else{
    687             for(i=1;i<n-1;++i)
    688                 if(a[i]*a[i]!=a[i-1]*a[i+1]) break;
    689             if(i<n-1) cout<<"No"<<endl;
    690             else cout<<"Yes"<<endl;
    691         }
    692     }
    693     return 0 ;
    694 }
    View Code
  • 相关阅读:
    一个python实现重试机制的简要实践
    元编程技术和动态编译
    NDoc使用简要手册增加了例子代码
    问dudu,评论是否只能删除,不可以直接修改?
    《C#类设计手册》读书随笔(4)
    .NET下几种动态生成代码方式比较
    NDoc使用简要手册
    "引用"表示什么?
    .NET环境编程全景不错的书
    C#实现动态灵活调用业务方法的机制
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4784692.html
Copyright © 2011-2022 走看看