本人写了一份压位高精乘除的求解卡特兰数的问题
n<=60000
如果压位1e4 则超时 校内OJ 84pts 如果压位1e5 则RE 校内OJ 36pts 不明白原因
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+5;
int q,a[N],b[N];
void mul(int k){
for(int i=1;i<=a[0];i++){
b[i]+=a[i]*k;
}
for(int i=1;i<=a[0];i++){
b[i+1]+=b[i]/10000;
b[i]%=10000;
}
if(b[a[0]+1]) a[0]++;
for(int i=1;i<=a[0];i++){
a[i]=b[i];
b[i]=0;
}
}
void rel(int k){
for(int i=a[0];i>=1;i--){
if(a[i]<k){
if(i==a[0]) a[0]--;
a[i-1]+=a[i]*10000;
a[i]=0;
}else{
a[i-1]+=(a[i]%k)*10000;
a[i]=a[i]/k;
}
}
}
inline ll read(){
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int main(){
q=read();
a[0]=a[1]=1;
for(int i=2;i<=q;i++){
int k=(4*i-2);
mul(k);
k=i+1;
rel(k);
}
for(int i=a[0];i>=1;i--){
for(int k=1000;k>=10;k/=10){
if(a[i]/k==0&&i!=a[0]){
write(0);
}else{
break;
}
}
write(a[i]);
}
}