B. Same Parity Summands
Description
You are given two positive integers n (1≤n≤10^9) and k (1≤k≤100). Represent the number n as the sum of k positive integers of the same parity (have the same remainder when divided by 2).
In other words, find a1,a2,…,ak such that all ai>0, n=a1+a2+…+ak and either all ai are even or all ai are odd at the same time.
If such a representation does not exist, then report it.
Input
The first line contains an integer t (1≤t≤1000) — the number of test cases in the input. Next, t test cases are given, one per line.
Each test case is two positive integers n (1≤n≤109) and k (1≤k≤100).
Output
For each test case print:
YES and the required values ai, if the answer exists (if there are several answers, print any of them);
NO if the answer does not exist.
The letters in the words YES and NO can be printed in any case.
Example
input
8 10 3 100 4 8 7 97 2 8 8 3 10 5 3 1000000000 9
output
ES 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
Solution
思路:
因为结果都要同一类数,非奇即偶,所以对于有答案的每组结果形式进行固定,固定形式为都是奇数的话,除第一个数其他数全为1,同理偶数则为2.
则本题主要对n减去k-1个1或者2的奇偶进行判断。若减去k-1个1仍是奇数或减去k-1个2仍为偶数则有答案并输出答案结构。
代码:
#include <iostream> #include <cstdio> #define ll long long using namespace std; int main(){ ll t,n,k; scanf("%lld",&t); while(t--){ cin>>n>>k; if( (n-(k-1))&1 && n-k+1 > 0){ printf("YES\n"); printf("%lld ",n-k+1); while(--k) printf("1 "); printf("\n"); continue; } if( !((n-k*2+2)&1) && n-k*2+2 > 0){ printf("YES\n"); printf("%lld ",n-2*k+2); while(--k) printf("2 "); printf("\n"); continue; } printf("NO\n"); } return 0; }