zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    I/O多路复用技术
    网络编程的异常及处理
    LINUX的signal
    网络编程小知识
    一个位压缩技巧
    加密技术[翻译]
    暴雪的hash算法[翻译]
    喜欢就好
    【PYTHON】编码是个细致活
    【Python3】POP3协议收邮件
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6830865.html
Copyright © 2011-2022 走看看