|
@@ -0,0 +1,49 @@
|
|
|
+package tuirngCup2019ahstuACM;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Scanner;
|
|
|
+/*
|
|
|
+要求生生的序列a1 a2 .. ak的和为n,且能整除d,d越大越好
|
|
|
+则可知a1 a2 .. ak每个数都可以被d整除,所以对这个等式左右约分化简,a1/d + a2/d + ... + ak/d = n/d
|
|
|
+n/d写做n2,a1/d ... ak/d 写做b1 b2 ... bk,可知如果想有解存在这个递增序列b,要满足 (k+1)*k/2 <= n2
|
|
|
+ */
|
|
|
+public class E {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Scanner cin = new Scanner(System.in);
|
|
|
+ int t = cin.nextInt();
|
|
|
+ while (t-->0){
|
|
|
+ int n = cin.nextInt(), k = cin.nextInt();
|
|
|
+ if(k == 1){
|
|
|
+ System.out.println(n);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ ArrayList<Integer>factor = new ArrayList<>();
|
|
|
+ int s = (int)Math.sqrt(n);
|
|
|
+ for(int i= 1; i <= s; i++){
|
|
|
+ if(n % i == 0){
|
|
|
+ factor.add(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Collections.reverse(factor);
|
|
|
+ boolean flag = false;
|
|
|
+ for (Integer i:factor
|
|
|
+ ) {
|
|
|
+ int n2 = n / i;
|
|
|
+ if((k+1)*k /2 <= n2){//有解
|
|
|
+ flag = true;
|
|
|
+ int sum = 0;
|
|
|
+ for(int j = 1; j < k; j++){
|
|
|
+ System.out.print(j*i + " ");
|
|
|
+ sum += j*i;
|
|
|
+ }
|
|
|
+ System.out.println(n - sum);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!flag){
|
|
|
+ System.out.println(-1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|