1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- 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);
- }
- }
- }
- }
|