Maximal GCD

題意:構造一個長度爲k的嚴格遞增的數組,要求這k個數的最大公約數儘可能的大,且這k個數的和爲n

如果不存在這樣的數組請直接輸出 -1.

思路;最大公因子i一定也是爲n的因子(k個i的倍數之和也一定爲i的倍數),故從大到小枚舉n的所有因子即可,枚舉時有一定技巧。

#include <iostream>
#include <cmath>

using namespace std;

long long n, k;

int check(long long x)
{
    if(x>n*2/k/(k+1))//必須用除法,不然會超時,估計跟數據太大有關
        return 0;
    for(int i = 1; i<=k-1; i++)
    {
        cout << x*i << " ";
        n -= x*i;
    }
    cout << n << endl;
    return 1;
}

int main()
{
    while(cin >> n >> k)
    {
        for(long long i = 1; i*i<=n; i++)//減少循環次數,降低算法複雜度到1e5(n極大時,根號n到n的數據個數極多,會超時):n/i,枚舉n到根號n的所有n的因子
        {
        	
            if(n%i)
                continue;
            //printf("*****%d\n",n/i);    
            if(check(n/i))//i是n的因子,則n/i也是n的因子
                return 0;
        }
        for(long long i = sqrt(n); i>0; i--)//枚舉根號n到1的所有n的因子
        {
        	
            if(n%i)
                continue;
            //printf("---------------%d\n",i);    
            if(check(i))
                return 0;
        }
        cout << "-1" << endl;
        return 0;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章