Solution
一个很简单的想法就是将整个序列变成 \(1\) 到 \(n\),这时我们需要对每个 \(a_i\) 执行 \(\bmod (a_i-i)\) 的操作,但是可能 \(a_i<i\),所以我们只需要在一开始加上一个极大值即可,刚好 \(n+1\) 次操作。
事实上,前面的构造并不完全正确,例如我们无论如何也不能将 \(4\) 通过取模变成 \(2\),即 \(2k\equiv k\pmod p(k\in \mathbb{N}^+)\) 永远不成立,但是我们可以通过加极大值来避免,这个极大值应至少大于 \(2\times 2000\),所以这个极大值至少得开到 \(4001\),实测 \(4001\) 可过,\(4000\) 会 WA。
Code
代码很短,甚至不用开数组。
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mkp make_pair
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using ull=unsigned long long;
inline void read(int &x){
char ch=getchar();
int r=0,w=1;
while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))r=(r<<1)+(r<<3)+(ch^48),ch=getchar();
x=r*w;
}
int main(){
int n;read(n);
printf("%d\n",n+1);
printf("1 %d 4001\n",n);
for(int i=1,x;i<=n;i++){
read(x);
printf("2 %d %d\n",i,x+4001-i);
}
return 0;
}
标签:ch,CF1088C,long,极大值,pair,using,define
From: https://www.cnblogs.com/LAK666/p/17035551.html