Multiples of Length CodeForces - 1397C(思维)

tech2023-12-05  32

题意:给出一个序列,每次操作可以使某一段的数变化这一段的长度的倍数,可以证明三步可以使这个序列变成0,问这三步操作分别是什么

思路:先想一下如何使这一段的变化是一个数的倍数,首先我们可以先让所有数变成-(n-1)a[i],即先把所有数都减去na[i],这样n-1个数都是(n-1)的倍数,最后变化最后一个数。

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=100005; typedef long long ll; const ll inf=0x3f3f3f3f; ll a[N]; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } if(n==1){ printf("1 1\n"); printf("%lld\n",-a[1]); printf("1 1\n"); printf("0\n"); printf("1 1\n"); printf("0\n"); return 0; } printf("1 %d\n",n); for(int i=1;i<=n;i++){ printf("%lld ",(-1)*a[i]*n); a[i]=a[i]*(n-1); } printf("\n"); printf("1 %d\n",n-1); for(int i=1;i<n;i++){ printf("%lld ",a[i]); // a[i]+=a[i]*(n-1); } printf("\n"); printf("%d %d\n",n,n); printf("%lld\n",a[n]); return 0; }
最新回复(0)