题目
题意:
给你一个序列,你需要将这个序列进行三次操作使得 a i = 0 ( 1 ≤ i ≤ n ) a_i=0(1\leq i\leq n) ai=0(1≤i≤n),在操作中你可以选定一个区间 ( l , r ) (l,r) (l,r),然后对于区间里面的每个数字你可以增加 ( r − l + 1 ) ∗ c i ( l ≤ i ≤ r ) (r-l+1) * c_i(l\leq i\leq r) (r−l+1)∗ci(l≤i≤r), c i c_i ci可以随意取,请你输出这三次操作中的 l , r , c 1 ∗ ( r − l + 1 ) . . . . . . l,r,c_1* (r-l+1)...... l,r,c1∗(r−l+1)......。
思路:
因为最后要为
0
,
0
,
.
.
.
.
0,0,....
0,0,....,那么我们对于每一个
a
i
a_i
ai,有
−
a
i
∗
x
+
a
i
∗
(
x
−
1
)
-a_i*x + a_i*(x-1)
−ai∗x+ai∗(x−1),我们需要将所有区间进行操作的话,那么此时的
x
=
n
x = n
x=n,所有就有第一次操作
a
i
=
a
i
−
a
i
∗
n
a_i=a_i -a_i * n
ai=ai−ai∗n,然后
a
i
=
a
i
+
a
i
∗
(
n
−
1
)
a_i=a_i + a_i * (n - 1)
ai=ai+ai∗(n−1),这样就可以让
(
1
,
n
−
1
)
(1,n-1)
(1,n−1)的数字全部变成
0
0
0,我们还有一次机会,那么就让
a
n
=
0
a_n=0
an=0就行了。
需要注意的是当
n
=
1
n=1
n=1的时候,需要特判一下。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <deque>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T>
inline void read(T &ret) {
char c;
int sgn;
if (c = getchar(), c == EOF) return ;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
sgn = (c == '-') ? -1:1;
ret = (c == '-') ? 0:(c - '0');
while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return ;
}
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
const int maxn = 1e5 + 10;
ll a[maxn] = {0};
int main() {
int n; read(n); for (int i = 1; i <= n; i++) read(a[i]);
if (n == 1) {
printf("1 1\n");
printf("%lld", -a[1]);
printf("\n1 1\n");
printf("0");
printf("\n1 1\n");
printf("0");
} else {
printf("1 %d\n", n);
for (int i = 1; i <= n; i++) printf("%lld ", -a[i] * n);
printf("\n1 %d\n", n - 1);
for (int i = 1; i < n; i++) printf("%lld ", a[i] * (n - 1));
printf("\n%d %d\n", n, n);
printf("%lld", a[n] * (n - 1));
}
return 0;
}