CF803C Solution

题目链接

题解

设答案序列GCD为\(p\),则\(n=p\cdot m\)。对于每一个\(p\)划分出的\(k\)最大时,序列为一个公差为\(p\)的等差数列,且\(p\)越大,最多可以划分的个数越小。将\(p\)由答案序列中提出,如果长度为\(k\)公差为\(1\)的等差数列和\(>m\),说明无法划分出\(k\)个元素。因此只需枚举\(k\),找出可以取到的最大\(p\)值,答案序列前\(k-1\)个元素为公差为\(p\)的等差数列,最后一个元素将\(n\)剩下的部分用尽即可。

AC代码

#include<bits/stdc++.h>
#define int long long 
using namespace std;
signed main()
{
	int n,k,i,x=0;//x:上文中的p
	scanf("%lld%lld",&n,&k);
	for(i=1;i*i<=n;i++)
	{
		if(n%i) continue;
		if(2*(n/i)/k>=k+1) x=max(i,x);//因为k^2会爆longlong,因此需将m>=k*(k+1)/2化简
		if(2*i/k>=k+1) x=max(n/i,x);
	}
	if(!x) {printf("-1"); return 0;}
	for(int j=1;j<k;j++) {printf("%lld ",j*x); n-=x*j;}
	printf("%lld",n);
	return 0;
}
posted @ 2021-03-11 18:57  violet_holmes  阅读(54)  评论(0编辑  收藏  举报