您的位置:首页 > 其它

Codeforces 803C Maximal GCD 题解

2017-04-30 12:02 363 查看

题意

找到和为n的k个严格递增的正整数,使得它们的GCD最大,如果没有,输出-1

思路

首先,考虑n和k的范围,发现k>200000时必然无解(当然这个范围还可以扩大),因为就算是从1开始的公差为1的序列和都会超过n的最大范围。其次,这个最大GCD肯定是n的一个约数,所以我们可以先求出n的所有约数,然后从大到小检验,检验的方法是先对n除以这个约数,然后看它和1+2+3+...+k的大小关系,如果它不小于这个和就可以了,就让前k-1个数是1至k-1倍的这个约数,用最后那个数凑出和为n就可以了

代码

#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector<long long> divv;
int main()
{
long long n,k,e,f;
scanf("%I64d%I64d",&n,&k);
if(k>200000)
printf("-1\n");
else
{
e=sqrt(n);
for(long long i=1;i<=e;i++)
if(n%i==0)
{
divv.push_back(i);
if(i*i!=n)
divv.push_back(n/i);
}
sort(divv.begin(),divv.end());
f=0;
for(long long i=divv.size()-1;i>=0;i--)
if(n/divv[i]>=k*(k+1)/2)
{
f=divv[i];
break;
}
if(f==0)
printf("-1\n");
else
{
for(long long i=0;i<k-1;i++)
{
printf("%I64d ",f*(i+1));
n-=f*(i+1);
}
printf("%I64d\n",n);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: