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
  • 相关阅读:
    笔记本
    物料主档建立(PP模组)
    烦!烦!烦!
    Windows Live Writer试用
    SAP系统中发送公告的几种办法
    [CSS样式表之] 渐变色的实现
    今天终于开通了这个博客了
    MFC消息映射机制过程
    绘图
    C++ 内存分配和指针
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9694702.html
Copyright © 2011-2022 走看看