如果不存在這樣的數組請直接輸出 -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;
}