E.java 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package tuirngCup2019ahstuACM;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Scanner;
  5. /*
  6. 要求生生的序列a1 a2 .. ak的和为n,且能整除d,d越大越好
  7. 则可知a1 a2 .. ak每个数都可以被d整除,所以对这个等式左右约分化简,a1/d + a2/d + ... + ak/d = n/d
  8. n/d写做n2,a1/d ... ak/d 写做b1 b2 ... bk,可知如果想有解存在这个递增序列b,要满足 (k+1)*k/2 <= n2
  9. */
  10. public class E {
  11. public static void main(String[] args) {
  12. Scanner cin = new Scanner(System.in);
  13. int t = cin.nextInt();
  14. while (t-->0){
  15. int n = cin.nextInt(), k = cin.nextInt();
  16. if(k == 1){
  17. System.out.println(n);
  18. continue;
  19. }
  20. ArrayList<Integer>factor = new ArrayList<>();
  21. int s = (int)Math.sqrt(n);
  22. for(int i= 1; i <= s; i++){
  23. if(n % i == 0){
  24. factor.add(i);
  25. }
  26. }
  27. Collections.reverse(factor);
  28. boolean flag = false;
  29. for (Integer i:factor
  30. ) {
  31. int n2 = n / i;
  32. if((k+1)*k /2 <= n2){//有解
  33. flag = true;
  34. int sum = 0;
  35. for(int j = 1; j < k; j++){
  36. System.out.print(j*i + " ");
  37. sum += j*i;
  38. }
  39. System.out.println(n - sum);
  40. break;
  41. }
  42. }
  43. if (!flag){
  44. System.out.println(-1);
  45. }
  46. }
  47. }
  48. }