codeforces/contest/803/problem C

题目:C. Maximal GCD

题意:输入n,k.将n拆成k个数的序列,使得这k个数的gcd最大。(且序列严格递增)。1 ≤ n, k ≤ 1010 。

分析:假设k个数的gcd为d,则一定有d|n,(即d一定是n的因子);遍历n所有的因子到即可。不要忘记考虑d和 的情况。

代码:

/*
Problem: C. Maximal GCD
Time: 2017/5/4/19:29
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#define ll long long
#define inf 100000000
#define N 1000000
using namespace std;

int main()
{
    ll n,k;
    scanf("%I64d%I64d",&n,&k);
    if(k>(ll)1e6){printf("-1
");return 0;}

    ll ma=n*2/k/(k+1);
    if(ma==0){printf("-1
");return 0;}
    ll ans=0;
    for(ll i=1;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            if(i<=ma&&i>ans) ans=i;
            if((n/i)<=ma&&(n/i)>ans) ans=n/i;
        }
    }
    for(ll i=1;i<k;i++)
        printf("%I64d ",ans*i);
    printf("%I64d
",n-ans*k*(k-1)/2);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/tristatl/p/6814988.html