CF1397-C. Multiples of Length

CF1397-C. Multiples of Length

题意:

给出一个长度为\(n\)的序列,让你进行下面操作三次使得整个序列全部变为\(0\)

​ 在序列中选中一段序列\((l, r)\),之后对这个序列中每个数字都加上一个\((l - r + 1)\)的倍数,这个倍数可以是负数,可以是零。


思路:

对于前\(n-1\)个数字中的每个数字\(a_i\)都加上它自身的\((n-1)\)倍,这样每个数字都变为自己原来的\(n\)倍。在对第\(n\)个数字加上它自身的\((-1)\)倍就变为了\(0\),在对\(1\)\(n\)的所有数字,每个数字加上它自身的\(-1\)倍即可将序列中所有数字变为零。


AC代码

#include <cstdio>
#include <cstring>
#include <iostream>

typedef long long ll;

const int Maxn = 100005;

ll a[Maxn];

void special_solve() {
	printf("1 1\n0\n");
	printf("1 1\n0\n");
	printf("1 1\n%lld", -a[0]);
}

void solve() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%lld", a + i);
	}
	if (n == 1) {
		special_solve();
		return;
	}
	printf("%d %d\n", 1, n - 1);
	for (int i = 0; i < n - 1; i++) {
		printf("%lld%c", (n - 1) * a[i], " \n"[i == n - 2]);
		a[i] = n * a[i];
	}
	printf("%d %d\n", n, n);
	printf("%lld\n", -a[n - 1]);
	a[n - 1] = 0;
	printf("%d %d\n", 1, n);
	for (int i = 0; i < n; i++) {
		printf("%lld%c", -a[i], " \n"[i == n - 1]);
	}
}

int main() {
	solve();
	return 0;
}

posted @ 2021-02-02 11:40  牟翔宇  阅读(73)  评论(0编辑  收藏  举报