#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans,flag,n,k,T;
int main(){
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%d%d",&n,&k);
for(int i=1;i*i<=n;i++){
if(n%i==0&&n>=i*(k+1)*k/2){
ans=i;
flag=1;
}
}
if(flag){
for(int i=1;i<=k-1;i++){
cout << ans*i<<" ";
}
cout << n-(k-1)*k/2*ans<<endl;
}
else
{
cout << -1 <<endl;
}
}
return 0;
}
测试数据错了,应该为10的8次方。o(n)复杂度
枚举n的除数就是最大公约数 i ,枚举到n,从小到大枚举到最大可行值。如果 n>=i*(k+1)*k/2 ,那么可求得 前k-1项分别为t,2t…(k-1)t,第k项为n-前(k-1)项和,因为n为t的倍数,减出的第k项一定为t的倍数。否则,不存在,输出-1。