CodeFoorces 803C Maximal GCD

枚举。

枚举$gcd$,然后计算剩下的那个数能不能分成$k$个递增的数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;

long long b[100010];
long long ans[200010];
int sz;
long long n,k;

void init()
{
	for(long long i=1;i*i<=n;i++)
	{
		if(n%i!=0) continue; 
		b[sz++] =i;
		if(i!=n/i) b[sz++] =n/i;
	}
}

int main()
{
	scanf("%lld%lld",&n,&k);
	init();

	sort(b,b+sz);

	if(k>200000)
	{
		printf("-1\n");
		return 0;
	}

	int suc=0;
	for(int i=sz-1;i>=0;i--)
	{
		long long sum = n/b[i];
		long long p = (1+k)*k/2;
		if(p>sum) continue;

		for(int j=1;j<=k;j++)
		{
			ans[j] = j;
			sum = sum-ans[j];
		}
		ans[k]+=sum;

		for(int j=1;j<=k;j++)
		{
			ans[j]=ans[j]*b[i];
		}

		suc=1;
		break;
	}

	if(suc==0)
	{
		printf("-1\n");
	}
	else 
	{
		for(long long i=1;i<=k;i++)
		{
			printf("%lld",ans[i]);
			if(i<k) printf(" ");
			else printf("\n");
		}
	}

	return 0;
}

 

posted @ 2017-05-10 17:28  Fighting_Heart  阅读(167)  评论(0编辑  收藏  举报