题意
一个长度为n的序列,你有两种操作:①将前i个数字加上一个值,②将前i个数字取余一个值。让你通过不超过n+1次操作,将序列变为递增的。
思路
可以想到构造成0,1,2,3,4…n-1这种形式。这个n+1给的很玄。
从后往前,通过n次加操作,把a[i]加到a[i]%n=i,最后所有数对n取余即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int n, k, a[MAXN];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
printf("%d\n", n + 1);
int sum = 0;
for (int i = n - 1; i >= 0; i--)
{
int add = (i - (a[i] + sum) % n + n) % n;
printf("1 %d %d\n", i+1, add);
sum += add;
}
printf("2 %d %d\n", n, n);
return 0;
}
/*
3
7 6 3
*/