- 首先拆成
s
=
2
+
⋯
+
k
≥
n
s=2+\cdots+k\ge n
s=2+⋯+k≥n,找到最小的
k
k
k ,根据以下三种情况来对
n
n
n 进行不同拆分:
s==n
:拆分方案为 2,3,4,...,k
s==n+1
:拆分方案为 3,4,...,k-1
s==n+m
其中 m>1
:拆分方案为 2,3,4,...,m-1,m+1,...,k
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000
using namespace std;
int n;
struct BigInt{
int a[MAXN],len,M=10000;
BigInt(){memset(a,0,sizeof(a));len=1;}
BigInt(int k){
memset(a,0,sizeof(a));
if(k==0){
len=1;
return ;
}
len=0;
while(k){
a[len++]=k%M;
k/=M;
}
}
BigInt operator=(const BigInt& b){
memset(a,0,sizeof(a));
len=b.len;
for(int i=0;i<b.len;i++)
a[i]=b.a[i];
return *this;
}
BigInt operator*(int b){
BigInt r(0);r.len=len;int up=0;
for(int i=0;i<len;i++){
int tmp=a[i]*b+up;
r.a[i]=tmp%M;
up=tmp/M;
}
while(up){r.a[r.len++]=up%M;up/=M;}
return r;
}
void output(){
printf("%d",a[len-1]);
for(int i=len-2;i>=0;i--)
printf("%04d",a[i]);
printf("\n");
}
};
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d",&n);
int res=2,k=3;
for(;res<n;k++)
res=res+k;
k--;
BigInt r(1);
if(res-n==0){
for(int i=2;i<=k;i++){
printf("%d ",i);
r=r*i;
}
}else if(res-n==1){
for(int i=3;i<=k-1;i++){
printf("%d ",i);
r=r*i;
}
r=r*(k+1);
}else{
for(int i=2;i<=k;i++)
if(i!=res-n){
printf("%d ",i);
r=r*i;
}
}
printf("\n");
r.output();
return 0;
}