正题
题目链接:https://www.luogu.com.cn/problem/CF476D
题目大意
求nnn个四元组使得
- 所有四元组内没有重复的数。
- 四元组内的数字两两之间gcdgcdgcd都为kkk。
要求使得最大的数字最小
1≤n≤10000,1≤k≤1001\leq n\leq 10000,1\leq k\leq 1001≤n≤10000,1≤k≤100
解题思路
首先kkk是没有用的因为可以视为互质,然后再乘kkk,然后考虑如何构造。
考虑每次在原来n−1n-1n−1个四元组的基础上加入四个数然后重新排列使得合法,首先对于任意xxx都有x,x+1,x+2x,x+1,x+2x,x+1,x+2肯定是互质的,所以一种比较可能正确的方法是把这三个排到一个二元组,然后再考虑剩下那个排啥,显然x+4x+4x+4不行,那就只能排x+5x+5x+5了。
这样一次占用了六个数字,可以证明是最优的做法但是我不会证/kk。
时间复杂度:O(n)O(n)O(n)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,k;
signed main()
{scanf("%lld%lld",&n,&k);printf("%lld\n",(6ll*n-1)*k);for(ll i=1;i<=n;i++)printf("%lld %lld %lld %lld\n",(6ll*i-5ll)*k,(6ll*i-4ll)*k,(6ll*i-3ll)*k,(6ll*i-1ll)*k);return 0;
}