題解 CF1352B 【Same Parity Summands】
阿新 • • 發佈:2020-08-29
實際發表時間: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\),本質和奇偶性是一樣的