1.题意
给你一个正整数n。求k个正整数a1,a2,…,ak,如下所示:
a1+a2+…+ak=n
LCM(a1、a2、…、ak)≤n/2
这里,LCM是数字a1、a2、…、ak的最小公倍数。
我们可以证明,对于给定的约束,答案总是存在的。
2.输入输出
第一行包含一个整数t(1≤T≤10^4)-测试用例的数量。
每个测试用例的唯一一行包含两个整数n,k(3≤N≤109,k=3)。
3.思路
如果n是奇数,那么答案是(1,n/2,n/2)
如果n是偶数,但不是4的倍数,那么答案是(2,n/2−1,n/2−1).
如果n是4的倍数,那么答案是(n/2,n/4,n/4)。
4.板子
#include<iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
if (n % 2 != 0)
{
cout << 1 << " " << n / 2 << " " << n / 2 << endl;
}
else if (n % 2 == 0 && n % 4 != 0)
{
cout << 2 << " " << n / 2 - 1 << " " << n / 2 - 1 << endl;
}
else
{
cout << n / 2 <<" "<< n / 4 << " " << n / 4 << endl;
}
}
return 0;
}
本文探讨了一个数学问题:如何将一个正整数n拆分为k个正整数之和,使得这些数的最小公倍数不超过n/2。文章提供了针对不同情况的有效解决方案,并附带了实现该算法的C++代码。

794

被折叠的 条评论
为什么被折叠?



