#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
ll n,m,t;
int main() {
cin>>t;
while(t--){
cin>>n>>m;
//偶数个偶数相加,一定是偶数
//奇数个偶数相加,一定是偶数
//偶数个奇数相加,一定是偶数
//奇数个奇数相加,一定是奇数
if(m>n){
cout << "NO" << endl;
continue;
}
if(n % 2 == 1){
if(m % 2 == 0){
cout<<"NO"<<endl;
continue;
}else{
cout<<"YES"<<endl;
for(int i=1;i<=m-1;i++){
cout<<1<<" ";
}
cout<<n-m+1<<endl;
}
}
if(n % 2 == 0){
if(m % 2 == 1){
if(n < 2*m){
cout<<"NO"<<endl;
continue;
}
cout<<"YES"<<endl;
for(int i=1;i<=m-1;i++) cout<<2<<" ";
cout<<n-2*(m-1)<<endl;
}else{
cout<<"YES"<<endl;
for(int i=1;i<=m-1;i++) cout<<1<<" ";
cout<<n-m+1<<endl;
}
}
}
}
其实并不需要考虑这么多,学习别人的思路还是蛮重要的
先构造出来一个序列,根据必要的条件进行判断
一开始肯定考虑全部拿1 或 2
如果拿 1 的话 那么拿的最后一个数字就是 n-k+1 如果这个数大于 0 且这个数是奇数,那么构造出来了。
如果拿2 的话,那么拿的最后一个数字就是n - 2(k+1) ,如果这个数大于 0 且这个数是偶数,就输出就行了。
如果这两个方法都构造不出来,就直接NO
-——————————————————————————
个人方法是判奇偶
n如果是奇数,那么就需要奇数个奇数相加,同时最后一个奇数要为正
n如果偶数,那么就考虑拿奇数还是偶数,
如果 m 是奇数 那么一定要拿偶数, 奇数个偶数相加为偶数
如果 m 是偶数 都可以,但拿奇数能的构造结果的可能一定由于偶数的