P2532 [AHOI2012]树屋阶梯

题目链接:https://www.luogu.com.cn/problem/P2532

题意

N个阶梯,用N个矩阵有多少种摆放方式组合成。

思路

因为,N个梯阶最少需要N个矩形,所以我们摆放的时候,肯定要贪心一下。
考虑下面的梯阶,红色矩形必须包括在某个矩形内部。
图片说明
因为只能用N个矩形,所以包含这个红色矩形只能是下面四种颜色框起来的部分。
图片说明
其他部分就在除框起来部分之外找了。
比如蓝色框框:
图片说明

代码

#include<bits/stdc++.h>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug  freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e6+10;
const ll mod = 1e8+7;
using namespace std;

int N;
string f[maxn];
string mul(string a,ll b){
    string c = "";
    ll t = 0;
    for(int i = a.size()-1;i>=0 || t;i--){
        if(i>=0) t += (a[i]-'0')*b;
        c += (t%10) +'0';
        t/=10;
    }
    reverse(c.begin(),c.end());
    return c;
}
string div(string a,ll b){
    string c = "";
    ll cur = 0;
    for(int i = 0;i<a.size();i++){
        cur = cur*10 + (a[i]-'0');
        c += to_string(cur/b);
        cur %= b;
    }
    int idx = c.find_first_not_of('0');
    return idx!=-1 ? c.substr(idx) : "0";
}
int main(){
    ios;
    cin>>N;
    f[0] ="1";f[1] = "1";
    for(int i = 2;i<=N;i++){
        f[i] = div(mul(f[i-1],(4*i-2)),i+1);
    }
    cout<<f[N]<<'\n';
    return 0;
}