题意:给出n和k 构造出k个数递增的数 满足这k个数的和为n 并且这k个的gcd尽量大.
n,k<=1e10 无解输出-1.
k个数递增 则最小值为 mn=k*(1+k)/2 若mn>n则无解.
假设k个数的gcd为d 则a[1]+a[2]+..a[k]=n= d(p[1]+p[2]+..p[k])
d为n的约数,现在枚举n的因子d
只要找到 p[1]<p[2]<..p[k]. p[1]+p[2]+..p[k]=n/d. 则找到一组可行解
n,k<=1e10 无解输出-1.
k个数递增 则最小值为 mn=k*(1+k)/2 若mn>n则无解.
假设k个数的gcd为d 则a[1]+a[2]+..a[k]=n= d(p[1]+p[2]+..p[k])
d为n的约数,现在枚举n的因子d
只要找到 p[1]<p[2]<..p[k]. p[1]+p[2]+..p[k]=n/d. 则找到一组可行解
构造:当1+..k<=n/d时,令p序列为{1,2...k+r} r=n/d -mn即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
ll n,k;
vector<ll> v,res;
int main()
{
cin>>n>>k;
ll mn=(1ll+k)*k/2;
if(mn>n||k>=1e6)
{
cout<<-1<<endl;
return 0;
}
for(ll i=1;i*i<=n;i++)
{
if(n%i==0)
{
v.push_back(i);
if(i*i!=n)
v.push_back(n/i);
}
}
sort(v.begin(),v.end());
for(int i=v.size()-1;i>=0;i--)
{
ll d=v[i],y=n/d;
if(mn>y)
continue;
for(int j=1;j<=k;j++)
{
if(j==k)
res.push_back(d*(y-mn+k));
else
res.push_back(d*j);
}
break;
}
for(int i=0;i<res.size();i++)
printf("%I64d ",res[i]);
printf("\n");
return 0;
}