1. 程式人生 > 實用技巧 >題解 CF1352B 【Same Parity Summands】

題解 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\),本質和奇偶性是一樣的