↵
~~~~~↵
#include <bits/stdc++.h>↵
using namespace std;↵
#define int long long↵
#define inf LLONG_MAX↵
#define pb push_back↵
#define deb cout<<"YES"<<endl↵
#define fi first↵
#define se second↵
#define pii pair<int,int>↵
#define lc 2*pos↵
#define rc 2*pos+1↵
#define fokus ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);↵
int calc(int n,int a){↵
int x= 2*a + n-1; ↵
x*=n; ↵
x/=2;↵
return x;↵
↵
}↵
signed main(){↵
fokus↵
vector<int>pul(10); ↵
pul[0]=1; ↵
for(int i=1;i<=6;i++) pul[i]=pul[i-1]*10; ↵
int t;cin>>t;while(t--){↵
int a,b,c,k;cin>>a>>b>>c>>k;↵
if (a>b) swap(a,b); ↵
if (c-b!=1 && c-b!=0){↵
cout<<-1<<endl;↵
continue; ↵
}↵
int l=pul[a-1],r=pul[a]-1; ↵
bool yes=0;↵
while(l<=r){↵
int mid=(l+r)/2; ↵
int aa=pul[b]-1-max(pul[c-1]-pul[a-1],1ll)+1; ↵
int cc=max(0ll,pul[b]-1+pul[a-1]-(pul[c]-1)); ↵
aa-=cc;↵
int prev=calc(mid-1-pul[a-1]+1,aa); ↵
int cur=calc(mid-pul[a-1]+1,aa);↵
// cout<<mid<<" "<<prev<<" "<<cur<<" "<<aa<<endl; ↵
int dif=k-prev; ↵
int tar=max(pul[c-1]-mid-1,0ll)+dif; ↵
int mi=tar+mid; ↵
if (prev<=k && k<=cur && mi<=pul[c]){↵
cout<<mid<<" + "<<tar<<" = "<<mi<<endl; ↵
yes=1; ↵
break;↵
}↵
else if (cur<k) l=mid+1; ↵
else r=mid-1;↵
}↵
if (!yes) cout<<-1<<endl; ↵
↵
}↵
}↵
↵
↵
↵
// 100 ↵
// 10 90↵
// 1. cuman bisa yang lowest ↵
↵
// Minimal + maks dari ini buat jadiin c ↵
// Minimal = pul[a-1]↵
// Maksimal b= pul[]↵
↵
↵
↵
// pul[c+1]-1 ↵
// bikin 100 perlu berapa dan terus maksimalnya berapa ~~~~~↵
↵
Hi! So this is the problem: https://codeforces.net/contest/1836/problem/C↵
I think the solution is basically the same but I am using binary search (which is actually not needed but yeah the idea should have been the same)↵
but this is incorrect... does anyone know where is the fault or is it logic fault?↵
thank you so much!
~~~~~↵
#include <bits/stdc++.h>↵
using namespace std;↵
#define int long long↵
#define inf LLONG_MAX↵
#define pb push_back↵
#define deb cout<<"YES"<<endl↵
#define fi first↵
#define se second↵
#define pii pair<int,int>↵
#define lc 2*pos↵
#define rc 2*pos+1↵
int x= 2*a + n-1; ↵
x*=n; ↵
x/=2;↵
return x;↵
↵
}↵
signed main(){↵
pul[0]=1; ↵
for(int i=1;i<=6;i++) pul[i]=pul[i-1]*10; ↵
int t;cin>>t;while(t--){↵
int a,b,c,k;cin>>a>>b>>c>>k;↵
if (a>b) swap(a,b); ↵
if (c-b!=1 && c-b!=0){↵
cout<<-1<<endl;↵
continue; ↵
}↵
int l=pul[a-1],r=pul[a]-1; ↵
bool yes=0;↵
while(l<=r){↵
int mid=(l+r)/2; ↵
int aa=pul[b]-1-max(pul[c-1]-pul[a-1],1ll)+1; ↵
int cc=max(0ll,pul[b]-1+pul[a-1]-(pul[c]-1)); ↵
aa-=cc;↵
int prev=calc(mid-1-pul[a-1]+1,aa); ↵
int cur=calc(mid-pul[a-1]+1,aa);↵
// cout<<mid<<" "<<prev<<" "<<cur<<" "<<aa<<endl; ↵
int dif=k-prev; ↵
int tar=max(pul[c-1]-mid-1,0ll)+dif; ↵
int mi=tar+mid; ↵
if (prev<=k && k<=cur && mi<=pul[c]){↵
cout<<mid<<" + "<<tar<<" = "<<mi<<endl; ↵
yes=1; ↵
break;↵
}↵
else if (cur<k) l=mid+1; ↵
else r=mid-1;↵
}↵
if (!yes) cout<<-1<<endl; ↵
↵
}↵
}↵
↵
↵
↵
// 100 ↵
// 10 90↵
// 1. cuman bisa yang lowest ↵
↵
// Minimal + maks dari ini buat jadiin c ↵
// Minimal = pul[a-1]↵
// Maksimal b= pul[]↵
↵
↵
↵
// pul[c+1]-1 ↵
// bikin 100 perlu berapa dan terus maksimalnya berapa ~~~~~↵
↵
Hi! So this is the problem: https://codeforces.net/contest/1836/problem/C↵
I think the solution is basically the same but I am using binary search (which is actually not needed but yeah the idea should have been the same)↵
but this is incorrect... does anyone know where is the fault or is it logic fault?↵
thank you so much!