题解 P2532 【[AHOI2012]树屋阶梯】

此题就是一个卡兰特数列,用个高精就行 = = // luogu-judger-enable-o2

include<bits/stdc++.h>

define me(a) memset(a,0,sizeof(a))

//#pragma GCC optimize(0)//o0优化

//#pragma GCC optimize(2)//o2优化

//#pragma GCC optimize(3)//o3优化

using namespace std;

string h[501];

string cheng(string x,int y)

{

string ans="";
int a[299];
me(a);
int a1,b1,k,r=0;
a1=x.size();
for(int i=0;i<a1;i++)
{
    a[i]=x[a1-i-1]-'0';
}
for(int i=0;i<a1;i++)
{
    a[i]*=y;
}
for(int i=0;i<a1;i++)
{
    if(a[i]>9)
    {
        a[i+1]+=a[i]/10;
        a[i]%=10;
        if(i==a1-1)
        {
            a1++;
        }
    }
}
for(int i=a1-1;i>=0;i--)
{
    ans+=char(a[i]+48);
}
return ans;

}

string chu(string n,int y)

{

int a[299];

// me(a);

string ans="";
int x,yu=0;
x=n.size();
for(int i=0;i<x;++i)
{
    a[i]=(yu*10+(n[i]-'0'))/y;
    yu=(yu*10+(n[i]-'0'))%y;
}
int k=0;
while(a[k]==0&&k<x)
{
    k++;
}
for(int i=k;i<x;++i)
{
    ans+=char(a[i]+48);
}
return ans;

}

int main()

{

//freopen("ask.in","r",stdin);
//freopen("ask.out","w",stdout);
int n;
cin>>n;
h[0]="1";
for(int i=1;i<=n;++i)
{
    h[i]=chu(cheng(h[i-1],(4*i-2)),i+1);
}
cout<<h[n];
return 0;

}


//另,附上O(1)算法(逃:(由于字数限制,只好牺牲小号,来浪一波= =) O(1)算法

原文地址:https://www.cnblogs.com/ThinkofBlank/p/10146132.html