BZOJ 2822: [AHOI2012]树屋阶梯

来源:互联网 发布:直播行业数据分析 编辑:程序博客网 时间:2024/05/16 09:59

我好菜啊。。。为什么别人说是经典卡特兰数模型
题意都没看清 QAQ
显然每个凸出来的角各自都是一块 只有一个是覆盖了左下角的
那么就会把这个阶梯分成两个阶梯子问题
有f[n]=f[0]*f[n-1]+f[1]*f[n-2]+…f[n-1]*f[0]

弄个质因数分解搞一下然后单精乘高精就好啦

#include<bits/stdc++.h>using namespace std;const int N=1002;inline int read(){    char ch=getchar(); int x=0,f=1;    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}    return x*f;}int c[N],a[300],al;void add(int x,int u){    for(int i=2;i*i<=x;++i)        while(x%i==0)x/=i,c[i]+=u;    if(x!=1)c[x]+=u;}void mul(int x){    for(int i=1;i<=al;++i)a[i]*=x;    for(int i=1;i<=al;++i)        if(a[i]>9)a[i+1]+=a[i]/10,a[i]%=10,al=i+1>al?i+1:al;}int main(){    int n=read(),i;    for(i=n+2;i<=n+n;++i)add(i,1);    for(i=1;i<=n;++i)add(i,-1);    a[1]=al=1;    for(i=1;i<=n+n;++i)        while(c[i])mul(i),--c[i];    for(i=al;i;--i)printf("%d",a[i]); printf("\n");    return 0;}
1 0
原创粉丝点击