题意:
给你长度为n的数组a[i],最多操作n+1次,每次都可以将前 i 个数 (操作1)都加上x,或者(操作2)都%x ,(x为1e6以内的任意数,且每次操作可以不同), 使得数组a严格单调递增(一定后一项大于前一项)。 要你输出一个总的操作次数,再以 1 i x 或者 2 i x 的形式输出每次操作,其中 1和2是哪种操作,i 是前i个 。 如果不需要操作,输出0即可。
思路:
每个a[i]都加上一个巨大的数num,a[ i ] += num ; 然后每一个a[i] 都 a[i] = a[i] % (a[i] - i ),(i从1到n),这样就可以肯定地得到a[1]=1, a[2]=2, ....a[n]=n, 且总的操作次数正好 =n+1 。
n=1时,不用特判。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const ll mod=1e9+7; 20 const int INF= 0x3f3f3f3f; 21 const int N=3e5; 22 23 int n; 24 int a[2005]; 25 26 int main() 27 { 28 cin>>n; 29 for(int i=1;i<=n;i++) 30 { 31 scanf("%d",&a[i]); 32 a[i]+=N; 33 } 34 cout<<n+1<<endl; 35 printf("1 %d %d ",n,N); 36 for(int i=1;i<=n;i++) 37 { 38 printf("2 %d %d ",i,a[i]-i); 39 } 40 }