B. Same Parity Summands

题目:

输入
8
10 3
100 4
8 7
97 2
8 8
3 10
5 3
1000000000 9

输出
YES
4 2 4
YES
55 5 5 35
NO
NO
YES
1 1 1 1 1 1 1 1
NO
YES
3 1 1
YES
111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111120

 

 思路:

        这是一道思维题,构造算法

在这里,题目意思是 n 是 k 个元素的总和,每个元素它们的奇偶性一致,并且它们除以2余数相同

这里我们 每个元素除以 2 余数相同,就是奇偶性一致,又因为 它们当中元素肯定跟我们的 n 因子成倍数关系,所以我们可以从 分解因子 进行突破,构造出来就可以了

代码详解如下:

#include <iostream>
#define endl '\n'
#define YES puts("YES");
#define NO puts("NO");
using namespace std;
int n, k;

int other;	// 为 k - 1 个因子元素
int last;	// n - (k - 1) * other 为 k 最后一个元素


// 这里是构造得来的函数


inline bool Finds(int &i)
{
	other = (k - 1) * i;	// 我们找出符合 k - 1 个因子

	last = n - other;

	// 并判断 n - (k - 1 个因子) 后它们是否和 该因子成倍数关系
	// 并且它们的 除以 2 的余数是否相同
	// 是则输出答案即可
	if (other < n && last % i == 0 && last % 2 == i % 2)
	{
		YES;
		cout << last << ' ';
		k--;
		while (k--)
			cout << i << ' ';
		putchar('\n');
		return true;
	}
	return false;
}


inline void solve()
{
	cin >> n >> k;

	// 分解 n 的因子,因为我们总和 n 个 ai 中肯定有 n 的因子
	// 所以我们从 n 的因子中突破,对因子 构造即可获得答案
	for (int i = 1; i * i <= n; ++i)
	{
		if (n % i == 0)
		{
			if (Finds(i))
				return ;
			if (i * i != n)
			{
				int tem = n / i;
				if (Finds(tem))
					return ;
			}
		}
	}
	NO;
}

int main()
{
	int _t;
	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值