zoukankan      html  css  js  c++  java
  • 【题解】洛谷P2532 [AHOI2012]树屋阶梯(卡特兰数+高精)

    洛谷P2532:https://www.luogu.org/problemnew/show/P2532

    思路

    来自Sooke大佬的推导:

    https://www.luogu.org/blog/Sooke/solution-p2532

    代码

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define maxn 550
    int n;
    int a[maxn],b[maxn],ans[maxn*20];
    int gcd(int a,int b)
    {
        if(!b) return a;
        else return gcd(b,a%b);
    }
    void mul(int x)
    {
        int k=0;
        for(int i=1;i<=ans[0];i++)
        {
            ans[i]*=x;
            ans[i]+=k;
            k=ans[i]/10;
            ans[i]%=10;
        }
        while(k)
        {
            ans[++ans[0]]=k%10;
            k/=10;
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=2;i<=n;i++)//经过化简的分子分母 
        {
            a[i-1]=i+n;//分子
            b[i-1]=i;//分母 
        }
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(b[j]==1) continue;//如果分母是1 则不用约 
                int d=gcd(a[i],b[j]);    
                if(d!=1)//如果gcd不为1 则分子分母同时除gcd约分 
                {
                    a[i]/=d;
                    b[j]/=d;
                }
                if(a[i]==1) break;//如果分子已经约完就可以退出 
            }
        }
        //此时分母已经为1了 只需要把分子用高精乘起来即是ans 
        ans[0]=ans[1]=1;//ans[0]为位数 
        for(int i=1;i<n;i++)
        {
            if(a[i]==1) continue;
            mul(a[i]);
        }
        for(int i=ans[0];i>=1;i--)
        printf("%d",ans[i]);
    }
    View Code
  • 相关阅读:
    CentOS 7 安装MySQL 5.7
    Introduction to BGP (4)
    Introduction to BGP (3)
    Introduction to BGP (2)
    Introduction to BGP (1)
    Cisco NAT Fundation
    Linux安装Nginx
    GRE协议学习与练习
    Oracle Study Note : Users and Basic Security
    Oracle Study Note : Tablespace and Data Files
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9694702.html
Copyright © 2011-2022 走看看