题解 CF1396A
CF1397C
\(CF round 666\) 好神仙
题目大意
给定你一个长度为 \(n\) 的序列。
你可以进行 \(3\) 次操作。
每次可以选定一个区间,把这个区间的每个数都加上 \(len \times x\)
\(1.\) 数 \(x\) 是整数(可以为负)
\(2.\) 对于区间的每个数可以取不同的 \(x\)
问你最后方案是什么。
输出格式
分 \(3\) 段,每一段有 \(2\) 行。
第一行 \(2\) 个数表示区间 \(l\) ~ \(r\)。
第二行 \(r - l + 1\) 个数,表示加上的数,即 \(len \times x\)。
题解
考虑第一次我们只分区间 \(1 ~ 1\) ,这样可以确保它变为 \(0\)。
第二次我们想把区间 \(2 ~ n\) 的所有元素都变成 \(n\) 的倍数。
对于 \(a_i\) 我们可以把它加上一个 \(n - 1\) 的倍数 :\((n - 1) * a_i\)
那么新的 \(a_i\) 会变成 \(a_i + (n - 1) * a_i\) 也就是 \(a_i * n\) 那么就一定是 \(n\) 的倍数。
而且这个对于所有的 \(i \in [2, n]\) 都成立
最后就把 \(1 ~ n\) 都减去 \(a_i\) 就行了,因为 \(a_i\) 已经都是 \(n\) 的倍数了。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bits/stdc++.h>
#define maxn 100010
#define ls x << 1
#define rs x << 1 | 1
#define inf 0x3f3f3f3f
#define inc(i) (++ (i))
#define dec(i) (-- (i))
#define mid ((l + r) >> 1)
#define int long long
#define XRZ 1000000003
#define debug() puts("XRZ TXDY");
#define mem(i, x) memset(i, x, sizeof(i));
#define Next(i, u) for(register int i = head[u]; i ; i = e[i].nxt)
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout);
#define Rep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i <= i##Limit ; inc(i))
#define Dep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i >= i##Limit ; dec(i))
int dx[10] = {1, -1, 0, 0};
int dy[10] = {0, 0, 1, -1};
using namespace std;
inline int read() {
register int x = 0, f = 1; register char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
} int a[maxn];
signed main() {
int n = read();
Rep(i, 1, n) a[i] = read();
if(n == 1) {
printf("1 1\n0\n");
printf("1 1\n0\n");
printf("1 1\n%d", -a[1]);
}
else if(n == 2) {
printf("1 1\n%d\n", -a[1]);
printf("2 2\n%d\n", -a[2]);
printf("1 1\n0");
}
else if(n == 3) {
printf("1 1\n%d\n", -a[1]);
printf("2 2\n%d\n", -a[2]);
printf("3 3\n%d\n", -a[3]);
}
else {
printf("1 1\n%lld\n2 %lld\n", 0 - a[1], n);
Rep(i, 2, n) {
printf("%lld ", a[i] * (n - 1));
}
printf("\n1 %lld\n0 ", n);
Rep(i, 2, n) printf("%lld ", 0 - a[i] * n);
}
return 0;
}