牛牛有一个整数 n ,他想知道这个数字所有好的划分中字典序最小的划分方案是什么。
一个好的划分是一个正整数序列,序列中所有数字的和等于 n ,且序列中不存在相同的数。
Input
本题采用多组案例输入,第一行一个整数 T 代表案例组数。
每组案例中,输入一行一个整数代表 n (0 < n ≤ 1e6).
保证单个测试点中所有案例 n 的和不超过 1e6.
Output
对于每组案例,输出一行若干个正整数代表划分出字典序最小的序列,整数之间用空格分隔。
输入
3
4
7
10
输出
1 3
1 2 4
1 2 3 4
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int sum[10001];
void find()
{
for (int i=1;i<=10000;i++)
{
sum[i]=sum[i-1]+i;
}
}
int t,n;
signed main()
{
ios;
find();
cin>>t;
while (t--)
{
cin>>n;
int l=1,r=10000;
while (l<r)
{
int mid=l+r>>1;
if (sum[mid]>n) r=mid;
else l=mid+1;
}
for (int i=1;i<l-1;i++) cout<<i<<" ";
cout<<n-sum[l-2]<<endl;
}
return 0;
}