其实不难想,主要看你想的方向对不对
思路
(想看做法可以直接跳过这部分)
ai想变成0
一定是最后选择了某个长len得区间,使得自己是len的倍数
但是要在3次操作把n个数变成0,说明这个len区间必须很大很大
有没有可能把所有数先变成n的倍数,然后一次性消除掉呢?
因为一开始ai不一定是n的倍数,所以选择[1,n]是没有意义的
但是选择[1,n−1],加上n−1的若干倍不久可以变成n的倍数了吗?
做法
第一次操作的目的,把[1,n−1]变成n的倍数
所以对于ai,设加上了k(n−1)变成ai+k(n−1)
也就是kn+ai−k,所以k=ai
那么只要给每个ai加上ai(n−1)就可以变成n的倍数!!
第二次操作把[n,n]的数变成倍数
第三次操作把[1,n]都变成0(因为前面都变成了n的倍数)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+10;
int t,n,a[maxn],b[maxn];
signed main()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
if( n==1 )
{
cout << 1 << " " << 1 << '\n';
cout << -a[1] << '\n';
for(int i=2;i<=3;i++)
{
cout << 1 << " " << 1 << '\n';
cout << 0 << '\n';
}
return 0;
}
cout << 1 << " " << n-1 << "\n";
for(int i=1;i<=n-1;i++)
{
cout << (n-1)*a[i] << " ";
a[i]+=(n-1)*a[i];
}
cout << endl;
cout << n << " " << n << '\n';
cout << -a[n] << '\n';
cout << 1 << " " << n << '\n';
for(int i=1;i<n;i++)
cout << -a[i] << " ";
cout << 0;
}