#include<bits/stdc++.h>
#define MAXN 1000007
using namespace std;
int n;
long long a[MAXN],b[MAXN],s[2*MAXN],c[MAXN];
long long power[MAXN];
bitset<2*MAXN> bits,t;
void add(int x){
	while(bits[x]==1){
		bits[x]=0; x++;
	}
	bits[x]=1;
}
void rem(int x){
	while(bits[x]==0){
		bits[x]=1; x++;
		if(x>2000000){
			cout<<"No\n";
			exit(0);
		}
	}
	bits[x]=0;
}
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		s[i]=a[i]-b[i];
		s[n+i]=s[i];
	}
	for(int i=1;i<=n;i++){
		if(s[i]<=0)continue;
		for(int f=30;f>=0;f--){
			if((1<<f)&s[i])add(f+i-1);
		}
	}
	for(int i=1;i<=n;i++){
		if(s[i]>=0)continue;
		s[i]=-s[i];
		for(int f=30;f>=0;f--){
			if((1<<f)&s[i])rem(f+i-1);
		}
	}
	if(bits.count()==0){
		c[n]=0;
	}else{
		int sum=0;
		for(int i=0;i<n;i++)sum+=bits[i];
		if(sum>0){
			add(n);
			for(int i=0;i<n;i++)bits[i]=bits[i]^1;
			add(0);
			for(int i=n-1;i>=0;i--){
				if(bits[i]!=bits[n+i]){
					cout<<"No\n";
					return 0;
				}
				c[n]*=2; c[n]+=bits[i];
			}
			c[0]=c[n];
		}else{
			for(int i=2*n-1;i>=n;i--){
				c[n]*=2; c[n]+=bits[i];
			}
			if(n>50 or c[n]%((1LL<<n)-1)!=0){
				cout<<"No\n";
				return 0;
			}
			c[n]/=((1LL<<n)-1);
			c[n]*=(1LL<<n);
			c[0]=c[n];
		}
	}
	for(int i=n-1;i>=1;i--){
		c[i]=b[i+1]-a[i+1]+2*c[i+1];
	}
	for(int i=1;i<=n;i++){
		if(c[i]<0 or a[i]+c[i-1]-2*c[i]!=b[i]){
			cout<<"No\n";
			return 0;
		}
	}
	for(int t=1;t<=20;t++){
		for(int i=1;i<=n;i++){
			int give=min(a[i]/2,c[i]);
			
			a[i]-=2*give; c[i]-=give; 
			if(i<n)a[i+1]+=give;
			else a[1]+=give;
		}
	}
	for(int i=1;i<=n;i++){
		if(c[i]!=0){
			cout<<"No\n";
			return 0;
		}
	}
	cout<<"Yes\n";
	return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |