【数论-最小公倍数】Codeforces Round #708(Div.2) | C1. k-LCM

在这里插入图片描述
题意:
给出一个正整数 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

再考虑困难版本,先固定给出k-31,剩下的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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值