题意:
给出一个正整数 n
,找到 k
个正整数 a1 a2 ... ak
使得他们的和等于n
,且他们的最小公倍数小于等于 n/2
。简单版本中k=3
思路:
这个题要反着想,不要从因数分解的角度思考,这样的话要尝试的状态空间太大了,要反向思维。
先考虑简单版本,一定会拆成三个数
- 当n为奇数时,分别为
n/2 n/2 1
- 当n为偶数时
- 当n/2为偶数时,分别为
n/2 n/4 n/4
- 当n/2为奇数时,分别为
n/2-1 n/2-1 2
- 当n/2为偶数时,分别为
再考虑困难版本,先固定给出k-3
个1
,剩下的n-(k-3)
使用简易版本的思路
#include<cstdio>
using namespace std;
int main ()
{
int noc;
scanf("%d", &noc);
while(noc --) {
int n, k;
scanf("%d%d", &n, &k);
for (int i=0;i<k-3;++i) printf("1 ");
n -= (k-3);
if ( n & 1 == 1) {
printf("%d %d %d\n", n/2, n/2, 1);
} else if ((n/2) & 1 == 1) {
printf("%d %d %d\n", n/2-1, n/2-1, 2);
} else {
printf("%d %d %d\n", n/2, n/4, n/4);
}
}
return 0;
}