如何管理好一个团队河南做网站优化
第二天
1 B. Same Parity Summands
原题链接:Problem - 1352B - Codeforces
rating : 1200
题目描述:
给定两个正整数 n(1≤n≤10^9)和 k(1≤k≤100)。将数字 n 表示为 k 个相同奇偶性的正整数之和(除以 2 时余数相同)。
换句话说,找到 a1, a2, …, ak,使得所有 ai>0,n=a1+a2+…+ak,并且所有 ai 同时是偶数或奇数。
如果不存在这样的表示,则报告它。
思路描述:
首先我们要知道一个点,那就是任何一个正整数加上一个偶数,这个数奇偶性不会发生改变,即一个奇数加一个偶数的和还是奇数,一个偶数加一个偶数的和还是一个偶数
所以,根据这个特性,我们只需要判断最后一个数字加上n%k之后会不会发生奇偶性变化,即判断n%k是否为偶数
如果为偶数,那么前k-1个数字我们让他是n/k,最后一个数字是n/k+n%k,因为n%k是偶数,所以最后一个数字的奇偶性跟前k-1个数字是相同的,这就是答案
如果n%k此时是奇数,那么我们可以将前k个数字都-1,判断n%k+k是否是偶数,如果是偶数,那么存在答案
如果n%k+k是奇数,那么一定不存在答案
那为什么我们不继续加上一个k试一下呢?
如果继续加一个k,此时就是n%k+2 * k,因为2 * k是偶数,不改变原数字奇偶性,所以等同于没加,所以不需要继续加
完整代码:
#include<iostream>long long int t;
long long int n, k;int main() {std::cin >> t;while (t--) {std::cin >> n >> k;//如果数字个数大于n,那么序列和一定大于n,一定无解if (k > n)std::cout << "NO" << std::endl;else {long long int q = n / k;//商long long int r = n % k;//余数//如果r是偶数,那么就是能转换成答案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此时不是偶数,看看能不能把r转换成偶数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;
}