思路:若这K个数字的gcd为d,那么N一定可以整除d,所以考虑从N的因子里选出这个d来,先求出K个数字可以表示的最小的数,即1+2+3+...+k,二分找出比这个数大的N的因子fact,那么N/fact就是这K个数的最大公因数,输出即可。
# include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
set<ull>s;
int main()
{
ull n, k;
scanf("%I64u%I64u",&n,&k);
if(k+1 > 2*n*1.0/k) return 0*puts("-1");
for(int i=1; i<=sqrt(n); ++i)
if(n%i==0) s.insert(i),s.insert(n/i);
ull max_num = (ull)(k*1.0/2*(k+1));
auto it = s.lower_bound(max_num);
ull sub = *it-max_num;
max_num = n/(*it);
for(int i=1; i<k; ++i)
printf("%I64u ",i*max_num);
printf("%I64u\n",max_num*(k+sub));
return 0;
}