2707 liylho的难题
Time Limit : 2000/1000 MS(Java/Others) | Memory Limit :65536/32768 KB(Java/Others)
Submits : 28 | Solved : 8
Description
Liylho在考试中得了第一名,所以老师让他去向学习委员要奖品。可是在liylho找到学习委员要奖品时,他却说要想拿到奖品就得做出他的难题:学习委员QQ账号里共有x个欢乐豆,现在他想把这x个豆子分为数量严格递增的n堆,问怎样分才能使得这n堆欢乐豆数量的最大公约数最大?
liylho掰着手指头算了好久都没算出来,聪明的你能帮帮可怜的liylho吗?
Input
输入包含多组,每组输入两个整数 x和n (1 ≤ x ≤ 1e9,1<=n<=1e3).
Output
输从每堆数量小到大输出分配方案,若不存在合适的分配方案则输出-1.若有多种方案 输入字典序最小的一组
Sample Input
6 38 2
Sample Output
1 2 32 6
HINT
Source
NBU OJ
中文题意略。
POINT:
求的这个最大公约数,肯定是这个x的因子。先记录下所有的x的因子,排个序。
如果因子a满足 [(n+1)*n/2]*a即(1a+2a+3a+4a^+na)的和>=x,则这个因子绝对可以用来分。
找出最大的因子,然后输出1a 2a 3a 4a ……,最后一项为x-sum前。
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
#define LL long long
vector<LL>y;
void yinzi(LL x)
{
for(LL i=1;i<=sqrt(x)+1;i++)
{
if(x%i==0){
y.push_back(i);
if(x%i!=i)
y.push_back(x/i);
}
}
}
int main()
{
LL x,n;
while(~scanf("%lld %lld",&x,&n))
{
if(x<(n+1)*n/2){
printf("-1\n");
continue;
}
y.clear();
yinzi(x);
sort(y.begin(),y.end());
LL a;
for(LL i=y.size()-1;i>=0;i--)
{
a=y[i];
if((n+1)*n/2*a<=x)
{
break;
}
}
for(LL i=1;i<n;i++)
{
printf("%lld ",i*a);
x-=i*a;
}
printf("%lld\n",x);
}
}