This code gives wrong answer
#include <iostream>
#include <string>
#include <vector>
using namespace std;
long long modPow(int b){
long long i=1,k=2;
b--;
while(b>0){
if(b&1){
i=(i*k)%1000000007;
b--;
}
else{
k=(k*k)%1000000007;
b/=2;
}
}
return i;
}
int main() {
int c,n,j,s,flag,check,equal;
long long ans;
string x,y;
vector<int> a,b;
cin>>n;
for(int c=1;c<=n;c++){
cin>>x>>y;
equal=0;
if(x==y) equal=1;
s=x.size();
for(int i=0;i<s;i++){
x[i]-=48;
y[i]-=48;
a.push_back(x[i]);
b.push_back(y[i]);
}
flag=0;
for(j=0;j<s;j++){
if(a[j]>b[j]){
flag=1;
break;
}
else if(a[j]<b[j]){
flag=-1;
break;
}
}
for(j=0;j<s;j++){
if(a[j]!=1) break;
}
if(j==s&&b[0]==1) flag=2;
for(j=0;j<s;j++){
if(b[j]!=1) break;
}
if(j==s&&a[0]==1) flag=2;
ans=0,check=0;
if(flag==1){
for(int i=0;i<s;i++){
if((b[i]>a[i])&&check==0) check=1;
if(check==0&&a[i]==1) ans+=modPow(s-i);
if(check==1&&b[i]==1) ans+=modPow(s-i);
}
}
else if(flag==-1){
for(int i=0;i<s;i++){
if((a[i]>b[i])&&check==0) check=1;
if(check==0&&b[i]==1) ans+=modPow(s-i);
if(check==1&&a[i]==1) ans+=modPow(s-i);
}
}
else if(flag==2){
ans+=modPow(s+1)-1;
check=1;
}
if(flag!=0&&equal==1) ans--;
a.clear();
b.clear();
ans%=1000000007;
cout<<"Case "<<c<<": "<<ans<<"\n";
}
return 0;
}
Any kind of constructive suggestion is appreciated. Thanks in advance.