50pts TLE+RE求调
查看原帖
50pts TLE+RE求调
1121518
StarsIntoSea楼主2023/11/19 16:25
#include<cstdio>
#include<cstring>
#include<cmath>
int p,lenb=1,lena=1;
const int N=1300;
int a[N],b[N];
void add1(){//高精乘
	int mol[N]={0};
	memset(mol,0,sizeof(mol));
	for(int i=1;i<=lena;++i){
		int x=0;
		for(int j=1;j<=lenb;++j){
			mol[i+j-1]=mol[i+j-1]+a[i]*b[j]+x;
			x=mol[i+j-1]/10;
			mol[i+j-1]%=10;
		}
		mol[i+lenb]=x;
	}
	if(lena<=500){
		lena+=lenb;
		while(mol[lena]==0&&lenb>1) lena--;
	}
	for(int i=1;i<=lena;++i) a[i]=mol[i];
}
void add2(){//高精乘
	int mol[N]={0};
	memset(mol,0,sizeof(mol));
	for(int i=1;i<=lenb;++i){
		int x=0;
		for(int j=1;j<=lenb;++j){
			mol[i+j-1]=mol[i+j-1]+b[i]*b[j]+x;
			x=mol[i+j-1]/10;
			mol[i+j-1]%=10;
		}
		mol[i+lenb]=x;
	}
	if(lenb<=500){
		lenb*=2;
		while(mol[lenb]==0&&lenb>1) lenb--;
	}
	for(int i=1;i<=lenb;++i) b[i]=mol[i];
}
signed main(){
	scanf("%d",&p);
    printf("%d\n",(int)(log10(2)*p+1));
	b[1]=2;
	a[1]=1;
	while(p){//快速幂
		if(p%2==1) add1();
		p=p>>1;
		add2();
	}
	a[1]--;
	for(int i=500;i>0;i--){
		if(i!=500&&i%50==0) printf("\n");
		printf("%d",a[i]);
	}
}
2023/11/19 16:25
加载中...