如何管理好一個(gè)團(tuán)隊(duì)百度移動(dòng)端關(guān)鍵詞優(yōu)化
第二天
1 B. Same Parity Summands
原題鏈接:Problem - 1352B - Codeforces
rating : 1200
題目描述:
給定兩個(gè)正整數(shù) n(1≤n≤10^9)和 k(1≤k≤100)。將數(shù)字 n 表示為 k 個(gè)相同奇偶性的正整數(shù)之和(除以 2 時(shí)余數(shù)相同)。
換句話說(shuō),找到 a1, a2, …, ak,使得所有 ai>0,n=a1+a2+…+ak,并且所有 ai 同時(shí)是偶數(shù)或奇數(shù)。
如果不存在這樣的表示,則報(bào)告它。
思路描述:
首先我們要知道一個(gè)點(diǎn),那就是任何一個(gè)正整數(shù)加上一個(gè)偶數(shù),這個(gè)數(shù)奇偶性不會(huì)發(fā)生改變,即一個(gè)奇數(shù)加一個(gè)偶數(shù)的和還是奇數(shù),一個(gè)偶數(shù)加一個(gè)偶數(shù)的和還是一個(gè)偶數(shù)
所以,根據(jù)這個(gè)特性,我們只需要判斷最后一個(gè)數(shù)字加上n%k之后會(huì)不會(huì)發(fā)生奇偶性變化,即判斷n%k是否為偶數(shù)
如果為偶數(shù),那么前k-1個(gè)數(shù)字我們讓他是n/k,最后一個(gè)數(shù)字是n/k+n%k,因?yàn)閚%k是偶數(shù),所以最后一個(gè)數(shù)字的奇偶性跟前k-1個(gè)數(shù)字是相同的,這就是答案
如果n%k此時(shí)是奇數(shù),那么我們可以將前k個(gè)數(shù)字都-1,判斷n%k+k是否是偶數(shù),如果是偶數(shù),那么存在答案
如果n%k+k是奇數(shù),那么一定不存在答案
那為什么我們不繼續(xù)加上一個(gè)k試一下呢?
如果繼續(xù)加一個(gè)k,此時(shí)就是n%k+2 * k,因?yàn)? * k是偶數(shù),不改變?cè)瓟?shù)字奇偶性,所以等同于沒加,所以不需要繼續(xù)加
完整代碼:
#include<iostream>long long int t;
long long int n, k;int main() {std::cin >> t;while (t--) {std::cin >> n >> k;//如果數(shù)字個(gè)數(shù)大于n,那么序列和一定大于n,一定無(wú)解if (k > n)std::cout << "NO" << std::endl;else {long long int q = n / k;//商long long int r = n % k;//余數(shù)//如果r是偶數(shù),那么就是能轉(zhuǎn)換成答案if (r % 2 == 0) {std::cout << "YES" << std::endl;for (int i = 1; i < k; i++)std::cout << q << ' ';std::cout << r + q << std::endl;continue;}//如果r此時(shí)不是偶數(shù),看看能不能把r轉(zhuǎn)換成偶數(shù)q--, r += k;if (q > 0 && r % 2 == 0) {std::cout << "YES" << std::endl;for (int i = 1; i < k; i++)std::cout << q << ' ';std::cout << r + q << std::endl;}else std::cout << "NO" << std::endl;}}return 0;
}