zoukankan      html  css  js  c++  java
  • BZOJ2822 [AHOI2012]树屋阶梯

    求卡特兰数,h[i]=C(2n,n)/(n+1)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int v[1005],p[1005],num[1005],n,cnt;
     4 void pri()
     5 {
     6     for(int i=2;i<=n*2;++i)
     7     {
     8         if(!v[i])p[++cnt]=i;
     9         for(int j=1;j<=cnt&&i*p[j]<=n*2;++j)
    10         {
    11             v[j]=1;if(i%p[j]==0)break;
    12         }
    13     }
    14 }
    15 void add(int x,int f)
    16 {
    17     int j=1;
    18     while(x!=1)
    19     {
    20         while(x%p[j]==0)num[j]+=f,x/=p[j];
    21         j++;
    22     }
    23 }
    24 struct node{
    25     int v[305],l;
    26     node operator *(int x)
    27     {
    28         for(int i=1;i<=l;++i)v[i]=v[i]*x;
    29         for(int i=1;i<=l;++i)
    30         {
    31             v[i+1]+=v[i]/10;
    32             v[i]%=10;
    33             if(v[l+1])++l;
    34         }
    35         return *this;
    36     }
    37     void print(){
    38         for(int i=l;i;--i)
    39         printf("%d",v[i]);
    40     }
    41 }ans;
    42 int main()
    43 {
    44     scanf("%d",&n);
    45     pri();
    46     for(int i=n*2;i>n;--i)add(i,1);
    47     for(int i=1;i<=n+1;++i)add(i,-1);
    48     ans.v[1]=1;ans.l=1;
    49     for(int i=1;i<=cnt;++i)
    50     while(num[i]--)ans=ans*p[i];
    51     ans.print();
    52     return 0;
    53 }
  • 相关阅读:
    2020-03-23
    2020-03-22
    2020-03-21
    2020-03-20
    2020-03-19
    2020-03-18
    2020-03-17
    单元测试-java
    2020-03-16
    C语言拯救计划Day3-1之求一批整数中出现最多的个位数字
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8361075.html
Copyright © 2011-2022 走看看