由题意,我们先构造一个尽可能小的单调序列,若k*1.0/2*(k+1)是k个数最小的和,若大于n的话说明不存在该序列。
否则对i=1开始循环,i<=sqrt(n)的时找出n的因子,因为i是由小到大的,当i越小时,对应的t=n/i就会越大,
只要一个t符合g<=n/t就不需要再判断了,此时t是这k个数的最大公约数。
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
long long n,k,ant=0,t,i;
cin>>n>>k;
double g=k*1.0/2*(k+1); //当gcd=1时,n达到最小
if(g>n){ //若n小于该数则不符合该情况
cout<<"-1";return 0;
}
for(i=1;i<=sqrt(n);i++){ //循环找出n的因子
if(n%i) continue; //若i不是n的因子则进行下一轮
t=n/i; //i为n的因子,求出n的另一个因子
if(g<=n/t){
//因为i是由小到大的,当i越小时,对应的t就会越大,只要一个t符合条件就不需要再判断了
ant=t;
break;
}
else if(g<=n/i) //t不符合条件,所以找出i作为最大公因数
ant=i;
}
for(i=1;i<k;i++){ //逐个输出
cout<<ant*i<<' ';
n-=ant*i;
}
cout<<n<<endl;
return 0;
}