題名
Portal Codeforces 1497C2 k-LCM(ハードバージョン)
回答
ソリューションのセットを直接構築することは簡単ではありません。以下のためのLCM LCML C Mの場合、1 11はそれに寄与せず、k − 3k-3を解きますk−割り当てられた3つの番号111、k '= 3に変換、n' = n −(k − 3)k '= 3、n' = n-(k-3)k′=3 、n′=n−(k−3 )状況の問題。
k = 3の場合k = 3k=3、nnの場合nが奇数の場合、一連の解(1、n / 2、n / 2)(1、n / 2、n / 2)があります。(1 、n / 2 、n / 2 )。同様に、nnの場合nは偶数で、構成できます(2、n / 2 − 1、n / 2 − 1)(2、n / 2-1、n / 2-1)(2 、n / 2−1 、n / 2−1 )、LCMLCMを保証するためL C Mは、であり、N / 2 - 1のN / 2-1n / 2−1、n / 2 − 1 n / 2-1を確保する必要がありますn / 2−1存在因子2 22 ;n / 2 − 1 = 2 x + 1、x = 1、2、3、…n / 2-1 = 2x + 1、x = 1,2,3、\ cdotsと仮定n / 2−1=2 x+1 、バツ=1 、2 、3 、…、次にn = 4 x + 4 n = 4x + 4n=4 x+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;
}