链接
http://codeforces.com/problemset/problem/803/C
题目大意
给你两个数
n k
,让你求一个恰好含有
k
个数的严格上升数列,使得
题解
考虑枚举
gcd=d
,对于一个很大的
d
可能会无解,而且这时比
考虑一个
gcd=d
有解,怎样构造一个数列呢,可以直接贪心
1 2 3 4 5 ...
,然后到第
k
个数的时候,用
枚举
然后二分就行了
注意爆
long long
!
代码
//数学小题
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
ll N, lim, K, A, list[1000000];
void gao(ll d)
{
ll i, s=0;
for(i=1;i<K;i++)printf("%I64d ",i*d),s+=i*d;
printf("%I64d",N-s);
}
int main()
{
ll i;
scanf("%I64d%I64d",&N,&K);A=K*(K+1)/2;
if(K>1000000){printf("-1");return 0;}
for(i=1;i*i<=N;i++)if(N%i==0)list[++*list]=i, list[++*list]=N/i;
sort(list+1,list+*list+1);
for(i=*list;i;i--)
if((long double)A*list[i]<=(long double)N and A*list[i]<=N)
{
gao(list[i]);
break;
}
if(!i)printf("-1");
return 0;
}