题解 CF1352B 【Same Parity Summands】

实际发表时间:2020-05-19
https://www.luogu.com.cn/problem/CF1352B
这题无疑就是分几个类,如下:

Case1

可以分成\(k\)个奇数
那么我们就可以把\(n\)分成\(\begin{matrix}\underbrace{1+1+\cdots+1}\\k\text{个1}\\+(n-k+1)\end{matrix}\) ,
判断\(n-k+1\)的奇偶性即可

Case2

可以分成\(k\)个偶数
那么我们就可以把\(n\)分成\(\begin{matrix}\underbrace{2+2+\cdots+2}\\k\text{个2}\\+(n-2k+2)\end{matrix}\) ,
判断\(n-2k+2\)的奇偶性即可

Case3

上述情况都不符合,输出\(\mathcal{NO}\)

代码

#include<bits/stdc++.h>
using namespace std;

inline void readint(int &x)
{
    int f=1;x=0;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<3)+(x<<1)+ch-48;
        ch=getchar();
    }
    x*=f;
}

int t,n,k;

int main()
{
    readint(t);
    while(t--)
    {
        readint(n),readint(k);
        if(((n-k+1)&1)&&n>=k)
        {//Case1
            puts("YES");
            for(int i=1;i<k;i++)printf("1 ");输出k-1个1
            printf("%d\n",n-k+1);
            continue;
        }
        if(((n-2*k+2)&1)||n<=2*k-2)//判断不能执行Case2
        {
            puts("NO");//输出NO
            continue;
        }
        puts("YES");
        for(int i=1;i<k;i++)printf("2 ");//输出k个2
        printf("%d\n",n-2*k+2);
    }
    return 0;
}

判断\(\bmod 2\)我们可以使用&1位运算,即判断二进制下\(n\)的最后一位是否为\(1\),本质和奇偶性是一样的

posted @ 2020-08-29 10:49  ADay526  阅读(121)  评论(0)    收藏  举报