链接:
https://codeforces.com/problemset/problem/1521/B
题意:
给一个数组,想要让这个数组满足gcd(ai−1,ai)=1,你可以进行n次操作,如果满足min(ai,aj)=min(x,y),则将x赋给ai,将y赋给aj。
本题数组中最小的数一定会留下,并且题目没有要求n最小,所以我们直接找到最小的数,然后将数组变成向左右两边,每个数都递增加一的序列即可。
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
using namespace std;
typedef long long ll;
int a[1000003];
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
ll min = 1e18;
int pmin = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] < min) {
min = a[i];
pmin = i;
}
}
ll value = min;
cout << n - 1 << endl;
for (int i = pmin + 1; i <= n; i++) {
cout << pmin << " " << i << " " << min << " " << ++value << endl;
}
value = min;
for (int i = pmin - 1; i >= 1; i--) {
cout << pmin << " " << i << " " << min << " " << ++value << endl;
}
}
}