
题意:
给出一个正整数 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;
}

324

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



