codeforces-#666-C

codeforces-#666-C

八月 28, 2020

C. Multiples of Length

题意

给出一个数组a 长度为n<1e5 任意元素-1e9<ai<1e9

要求3次操作将原数组变为全0数组

一次操作为:

选取一段区间[L,R] 将其中的数加上或减去 bi×(R-L+1)

输出每次操作的区间和对应位置的bi (bi可以为0)

题解

十分巧妙的构造

首先对[1,n-1]位置上的数-a[i]×(n-1) 那么对于第i位数则变为

a[i]-(n-1)×a[i]=n×a[i]

再令[n,n]位置变为n的倍数

两步操作后所有的数都变为了n的倍数

最后一步让[1,n]上的数-n的倍数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define Turnoff std::ios::sync_with_stdio(false)
const ll Max=1e5+5;
const double Pi=acos(-1);
const ll Mod=1e9;
/*

*/

ll data[Max];
int main() {
Turnoff;
ll n;cin>>n;
for(int i=0;i<n;i++)cin>>data[i];
if(n==1){
cout<<1<<" "<<1<<endl;
for(int i=0;i<n;i++)cout<<0<<" ";
}
else {
cout<<1<<" "<<n-1<<endl;
for(int i=0;i<n-1;i++)cout<<(n-1)*data[i]<<" ";
}
cout<<endl;
cout<<n<<" "<<n<<endl;
cout<<n-data[n-1]<<endl;
cout<<1<<" "<<n<<endl;
for(int i=0;i<n-1;i++)cout<<-n*data[i]<<" ";
cout<<-n<<endl;
//cout<<data[i]<<endl;

}