求助,希望有人帮我看一下
查看原帖
求助,希望有人帮我看一下
386984
kd_homelander915楼主2023/3/30 21:50
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll n,a[10005],ans,cnt,now=2,sum,tar,tp,ac[10005][505],cntc[10005],c[505],cntcc,temp[505];
template <typename T>
void in(T &x){
	char c=getchar();
	bool f=true;
	for(;c<'0'||c>'9';c=getchar())
		if(c=='-')
		    f=false;
	for(x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<1)+(x<<3)+(c^48);
	if(!f)
	    x=-x;
}
void putf(ll x){
	if(x<0)
	    x=-x,putchar('-');
	if(x>9)
	    putf(x/10);
	putchar((x%10)^48);
}
int main(){
	ios::sync_with_stdio(false);
    in(n);
    tp=n;
    if(n==3){
    	printf("1 2\n");
    	printf("2");
    	return 0;
	}
	ans=1;
	while(now<=n){
	    a[++cnt]=now;
	    n-=now;
	    now++;
	}
	sum=(((now-1)*now)>>1)-1;
	if(sum==n){
	   	for(ll i=1;i<=cnt;i++){
	   		ans*=a[i];
	   		putf(a[i]);
	   		printf(" ");
		}
		putf(ans);
		return 0;
	}
	a[++cnt]=now;
	sum=((now*(now+1))>>1)-1;
	tar=sum-tp-1;
	for(ll i=tar;i<=cnt-1;i++)
	    a[i]=a[i+1];
	cnt--;
	for(ll i=1;i<=cnt;i++){
	   	ans*=a[i];
	   	putf(a[i]);
	   	printf(" ");
	   	while(a[i]){
	   		ac[i][++cntc[i]]=a[i]%10;
	   	    a[i]/=10;
		}
	}
	printf("\n");
	for(ll i=1;i<=cntc[1];i++)
	    for(ll j=1;j<=cntc[2];j++)
	        c[i+j-1]=ac[1][i]*ac[2][j];
	for(ll i=2;i<=cntc[1]+cntc[2];i++){
	    c[i]+=c[i-1]/10;
	    c[i-1]%=10;
	}
	if(c[cntc[1]+cntc[2]])
	    cntcc=cntc[1]+cntc[2];
	else
	    cntcc=cntc[1]+cntc[2]-1;
	for(ll i=3;i<=cnt;i++){
		for(ll j=1;j<=cntcc;j++)
		    for(ll k=1;k<=cntc[i];k++)
		        temp[j+k-1]=c[j]*ac[i][k];
		for(ll j=2;j<=cntcc+cntc[i];j++){
			temp[j]+=temp[j-1]/10;
			temp[j-1]%=10;
		}
		if(temp[cntcc+cntc[i]])
		    cntcc=cntcc+cntc[i];
		else
		    cntcc=cntcc+cntc[i]-1;
		for(ll j=1;j<=cntcc;j++)
		    c[j]=temp[j];
	}
	for(ll i=cntcc;i>=1;i--)
		putf(c[i]);
//	printf(" ");
//	putf(ans);
	return 0;
}
2023/3/30 21:50
加载中...