题目描述
There are N boxes arranged in a circle. The i-th box contains Ai stones.
Determine whether it is possible to remove all the stones from the boxes by repeatedly performing the following operation:
Select one box. Let the box be the i-th box. Then, for each j from 1 through N, remove exactly j stones from the (i+j)-th box. Here, the (N+k)-th box is identified with the k-th box.
Note that the operation cannot be performed if there is a box that does not contain enough number of stones to be removed.
Constraints
1≤N≤105
1≤Ai≤109
Determine whether it is possible to remove all the stones from the boxes by repeatedly performing the following operation:
Select one box. Let the box be the i-th box. Then, for each j from 1 through N, remove exactly j stones from the (i+j)-th box. Here, the (N+k)-th box is identified with the k-th box.
Note that the operation cannot be performed if there is a box that does not contain enough number of stones to be removed.
Constraints
1≤N≤105
1≤Ai≤109
输入
The input is given from Standard Input in the following format:
N
A1 A2 … AN
N
A1 A2 … AN
输出
If it is possible to remove all the stones from the boxes, print YES. Otherwise, print NO.
样例输入
5
4 5 1 2 3
样例输出
YES
提示
All the stones can be removed in one operation by selecting the second box.
题意:给出N个盒子,每个盒子装有Ai个石头。
每次操作可以选择一个盒子i,对于每个j(1 <= j <= N),从第(i+j)个盒子移走j个石头(第N+k个盒子即为第k个盒子)
如果存在一个盒子的石头数目不够操作将不能进行。求能否将所有的石头移走。如果可以全部移走输出yes否则输出no。
思路:如果可以将全部石头移走的话那么将是全部的石头加起来满足前n项和或者满足前n项和的倍数, 其次如果这些是头可以全部移走的两者之间的差值将会是1或者1-n根据这个用一个数组vis将两个之间的差值保存一下,之后再用for判断就可以了,这里需要注意的一点是我提交了好几代码都不对,后来发现是求前n项和的时候没有用longlong 。
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<iostream>
#include<map>
#define mes(a,b) memset(a,b,sizeof(a))
#define rep(i,m,n) for(i=m;i<=n;i++)
typedef long long ll;
using namespace std;
int max3(int a,int b,int c){return max(max(a,b),c);}
ll min3(ll a,ll b,ll c){return min(min(a,b),c);}
const double PI=acos(-1);
const int inf=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int mod=1e9+7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}
ll Fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n;n=n*n;}return r;}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n;
int a[100005],vis[100005];
int main(){
while(cin>>n)
{
ll sum=0,sum2,t;
bool flag=1;
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sum2=(ll)((1+n))*n/2;
if(sum%sum2!=0)
{
printf("NO\n");
continue;
}
t=sum/sum2;//printf("%d\n",t);
a[n]=a[0];
for(int i=0; i<n; i++)
vis[i]=a[i+1]-a[i];
for(int i=0; i<n; i++)
{
if((vis[i]-t)%n!=0 || vis[i]-t>0)
{
flag=0;
break;
}
}
if(flag==0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}