題意簡述
給出一個由
分析
考慮一次操作對環帶來了什麼影響。
(在
差分後:
可以看到,一次操作相當於對差分數列(或者說是差分環)的一個位置加上n-1,剩下的位置減去1。那麼只要檢查原環的差分數列能否全變爲0,並且此時和也爲0就行了。
對每一個位置的計算複雜度爲
實現
每次操作會使和
差分數列的每個位置要能在數個
列式表示爲
最後,如果
代碼
#include <cstdio>
typedef long long lint;
int const N=1e5+10;
int n,a[N];
int dif[N];
int main()
{
freopen("b.in","r",stdin);
scanf("%d",&n);
if(n==1) {printf("YES"); return 0;}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
a[n+1]=a[1];
lint s=(lint)n*(n+1)>>1,sum=0;
for(int i=1;i<=n;i++) sum+=a[i],dif[i]=a[i+1]-a[i];
if(sum%s!=0) {printf("NO"); return 0;}
lint k=sum/s,sumX=0;
for(int i=1;i<=n;i++)
{
lint x=(k-dif[i])/n;
if(x<0 || x*n!=k-dif[i]) {printf("NO"); return 0;}
sumX+=x;
}
if(sumX==k) printf("YES");
else printf("NO");
return 0;
}
注意
開longlong!int*int也有可能爆int,要先轉成longlong再乘!
連WA六發…