2155:授奖金
2155:发奖金
题目描述
ACM俱乐部最近赚大钱了,要把n元奖金分给若干个员工(至少两个)。员工的数目可以随意指定,但是这些员工领得的奖金数额必须构成一个连续的序列。比如5个人,分别取得3,4,5,6,7元。
输入格式
输入有多组数据。
每组数据一行,包含一个正整数n(小于等于2^20)。
输出
对应每组数据,输出若干行。每种分配方法输出一行(按员工数目由多到少排序),一行内输出各员工的奖金(由少到多排序,以空格分隔),行尾也请输出一个空格。
样例输入
15
28
样例输出
1 2 3 4 5
4 5 6
7 8
1 2 3 4 5 6 7
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n; void Print(int l,int r){ for(int i=l;i<=r;i++) printf("%d ",i); printf("\n"); } void solve(int x){ if(x<3) return ; int left=1,right=2,mid=(1+x)>>1; int sum=left+right; while(left<mid){ if(sum==x) Print(left,right); while(sum>x){ sum-=left; left++; if(sum==x) Print(left,right); } right++; sum+=right; } } int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d",&n)){ solve(n); } return 0; }