悬关 求助压位高精度出现RE
  • 板块学术版
  • 楼主W_Sibo
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/9 21:24
  • 上次更新2024/10/9 23:27:43
查看原帖
悬关 求助压位高精度出现RE
519276
W_Sibo楼主2024/10/9 21:24

本人写了一份压位高精乘除的求解卡特兰数的问题

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]);
	}
}
2024/10/9 21:24
加载中...