题意
传送门 Codeforces 1497C2 k-LCM (hard version)
题解
不易直接构造一组解。对于 L C M LCM LCM 而言, 1 1 1 对其无贡献,将解其中的 k − 3 k-3 k−3 个数字赋 1 1 1,转化为 k ′ = 3 , n ′ = n − ( k − 3 ) k'=3,n'=n-(k-3) k′=3,n′=n−(k−3) 情况下的问题。
当 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/2−1,n/2−1),为了保证 L C M LCM LCM 为 n / 2 − 1 n/2-1 n/2−1,需要保证 n / 2 − 1 n/2-1 n/2−1 存在因子 2 2 2;假设 n / 2 − 1 = 2 x + 1 , x = 1 , 2 , 3 , ⋯ n/2-1=2x+1,x=1,2,3,\cdots n/2−1=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;
}