AC日记——Maximal GCD codeforces 803c

803C - Maximal GCD

思路:

  最大的公约数是n的因数;

  然后看范围k<=10^10;

  单是答案都会超时;

  但是,仔细读题会发现,n必须不小于k*(k+1)/2;

  所以,当k不小于10^5时直接-1就好;

  我们可以构造出gcd为1的序列为

    1,2,3,4……n-k+1;

  然后一个个枚举n的因子p;

    1*p,2*p,3*p……(n-k+1)*p;

  当枚举的p使得序列不满足于严格递增时,结束,输出合法答案;

来,上代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define ll long long

long long n,k;

int main()
{
    cin>>n>>k;
    if(k==1)
    {
        cout<<n;
        return 0;
    }
    if(n<k||k>200000||k==0)
    {
        cout<<-1;
        return 0;
    }
    long long c=k*(k+1)/2;
    if(n<c)
    {
        cout<<-1;
        return 0;
    }
    ll p=n/c,last=1;
    for(ll i=2;i<=sqrt(n)+1;i++)
    {
        if(n%i) continue;
        ll ok=1,sum=n;
        for(ll j=1;j<k;j++)
        {
            sum-=j*i;
            if(sum<=j*i) ok=false;
        }
        if(sum<=i*(k-1)) ok=false;
        if(ok) last=i;
        else break;
    }
    for(ll i=sqrt(n)+1;i>=1;i--)
    {
        if(n%i) continue;
        ll a=n/i;
        ll ok=1,sum=n;
        for(ll j=1;j<k;j++)
        {
            sum-=j*a;
            if(sum<=j*a) ok=false;
        }
        if(sum<=a*(k-1)) ok=false;
        if(ok) last=a;
        else break;
    }
    ll sum=n;
    for(ll i=1;i<k;i++) printf("%lld ",i*last),sum-=i*last;
    printf("%lld",sum);
    return 0;
}
原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6830865.html