题目大意
给定 \(n,k\),构造 \(n\) 个元素互不相同的四元组,使得每个四元组的最大公约数为 \(k\),求所有元素最大值最小的一组构造。要求 \(1\le n\le10^4,1\le k\le100\)。
分析
首先把所有四元组除以 \(k\),那么所有四元组的最大公约数为 \(1\)。
考虑任意一个四元组都只能存在一个偶数,那么奇数起码三个,于是我们答案的下界为 \(6(n-1)+5=6n-1\)。
构造一组方案达到下界:
由于 \(\gcd(a,b)=\gcd(a,b-a)\),我们贪心的让方案内的差尽可能小,于是我们直接把最近的三个奇数和一个偶数放在一个四元组内,即第 \(i(0\leqslant i<n)\) 组为 \(6i+1,6i+2,6i+3,6i+5\)。
由 \(\gcd(a,b)=\gcd(a,b-a)\) 不难得知两两之间 \(\gcd\) 都为 \(1\),于是方案合法。
时间复杂度 \(O(n)\)。
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,k;
scanf("%d %d",&n,&k);
printf("%d\n",(n*6-1)*k);
for(int i=1; i<=n; i++) {
int x=i*6-5;
printf("%d %d %d %d\n",x*k,(x+1)*k,(x+2)*k,(x+4)*k);
}
return 0;
}