0%

奇偶选数和

奇偶选数和

问题描述

神秘人给了两个数字,分别表示 n 和 k,并要求 TT 给出 k 个奇偶性相同的正整数,使得其和等于 n。
例如 n = 10,k = 3,答案可以为 [4 2 4]。
本题是SPJ

Input

第一行一个整数 T,表示数据组数,不超过 1000。
之后 T 行,每一行给出两个正整数,分别表示 n (1 ≤ n ≤ 1e9)、k (1 ≤ k ≤ 100)。

Output

如果存在这样 k 个数字,则第一行输出 “YES”,第二行输出 k 个数字。
如果不存在,则输出 “NO”。

Sample

Input: 
8
10 3
100 4
8 7
97 2
8 8
3 10
5 3
1000000000 9

Output:
YES
4 2 4
YES
55 5 5 35
NO
NO
YES
1 1 1 1 1 1 1 1
NO
YES
3 1 1
YES
111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111120

Limitation

Time limit      1000 ms
Memory limit 262144 kb

解题思路

由于是正整数,数最小只能取1,若 k > n,则一定不行。

以下考虑 nk
n 为偶数,且 n ≥ 2k,则一定可以,因为可以用 (k - 1) 个 2 表示,最后一个数一定是偶数;若 kn < 2k,则可以先用 (k - 1) 个 1 表示,剩下最后一个数若为奇数,则可以,若为偶数则不行。
n 为奇数:若 k 为偶数,则一定不行;若 k 为奇数,用 (k - 1) 个 1 表示,剩下最后一个数一定也是奇数。

源代码

#include <iostream>
using namespace std;

int main() {
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
if (n % 2 == 0 && n >= 2 * k) {
int x1 = 2 * (k - 1);
int x2 = n - x1;
cout << "YES" << endl;
cout << x2;
for (int i = 0; i < k - 1; i++)
cout << " 2";
cout << endl;
}
else if (n % 2 == 0 && n >= k && n < 2 * k) {
int x1 = n - (k - 1);
if (x1 % 2 == 0)
cout << "NO" << endl;
else {
cout << "YES" << endl;
cout << x1;
for (int i = 0; i < k - 1; i++)
cout << " 1";
cout << endl;
}
}
else if (n % 2 == 1 && n >= k) {
if (k % 2 == 1) {
int x1 = n - (k - 1);
cout << "YES" << endl;
cout << x1;
for (int i = 0; i < k - 1; i++)
cout << " 1";
cout << endl;
}
else
cout << "NO" << endl;
}
else
cout << "NO" << endl;
}

return 0;
}