Codeforces 803C Maximal GCD 题解

来源:互联网 发布:淘宝冲印照片哪家好 编辑:程序博客网 时间:2024/05/21 17:37

题意

找到和为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;}
0 0