CF1088C

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;
}
posted @ 2023-01-08 21:59  Epoch_L  阅读(15)  评论(0编辑  收藏  举报