#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{
cout<<1/0;
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;
}
Compilation message (stderr)
remittance.cpp: In function 'int main()':
remittance.cpp:85:32: warning: division by zero [-Wdiv-by-zero]
85 | cout<<1/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... |