Codeforces 1497C2 LCM

题意

传送门 Codeforces 1497C2 k-LCM (hard version)

题解

不易直接构造一组解。对于 L C M LCM LCM 而言, 1 1 1 对其无贡献,将解其中的 k − 3 k-3 k3 个数字赋 1 1 1,转化为 k ′ = 3 , n ′ = n − ( k − 3 ) k'=3,n'=n-(k-3) k=3,n=n(k3) 情况下的问题。

k = 3 k=3 k=3,若 n n n 为奇数,则有一组解 ( 1 , n / 2 , n / 2 ) (1,n/2,n/2) (1,n/2,n/2)。同样的,当 n n n 为偶数,可以构造 ( 2 , n / 2 − 1 , n / 2 − 1 ) (2,n/2-1,n/2-1) (2,n/21,n/21),为了保证 L C M LCM LCM n / 2 − 1 n/2-1 n/21,需要保证 n / 2 − 1 n/2-1 n/21 存在因子 2 2 2;假设 n / 2 − 1 = 2 x + 1 , x = 1 , 2 , 3 , ⋯ n/2-1=2x+1,x=1,2,3,\cdots n/21=2x+1,x=1,2,3,,则有 n = 4 x + 4 n=4x+4 n=4x+4,可以构造一组解 ( n / 2 , n / 4 , n / 4 ) (n/2,n/4,n/4) (n/2,n/4,n/4)

#include <bits/stdc++.h>
using namespace std;
const int maxk = 100005;
int T, N, K, A[maxk];

int main()
{
    
    
    scanf("%d", &T);
    while (T--)
    {
    
    
        scanf("%d%d", &N, &K);
        for (int i = 4; i <= K; ++i)
            A[i] = 1;
        N -= K - 3;
        if (N & 1)
            A[1] = 1, A[2] = A[3] = N >> 1;
        else
        {
    
    
            if (!((N >> 1) & 1))
                A[1] = N >> 1, A[2] = A[3] = N >> 2;
            else
                A[1] = 2, A[2] = A[3] = (N >> 1) - 1;
        }
        for (int i = 1; i <= K; ++i)
            printf("%d%c", A[i], i == K ? '\n' : ' ');
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/neweryyy/article/details/115149338