还是格雷码+高精度。1A。。
#include<iostream>
#include<string>
using namespace std;
int f[128][50];
int start[128];
int finish[128];
int ko1[100];
int ko2[100];
int ans[100];
int main()
{
int test,i,j,length,sum;
memset(f,0,sizeof(f));
f[0][0]=1;
for(i=1;i<128;i++)
{
for(j=0;j<50;j++)
f[i][j]=f[i-1][j]*2;
for(j=0;j<50;j++)
{
f[i][j+1]=f[i][j+1]+f[i][j]/10;
f[i][j]=f[i][j]%10;
}
}
cin>>test;
while(test--)
{
cin>>length;
sum=0;
for(i=length-1;i>=0;i--)
{
cin>>start[i];
sum=sum+start[i];
}
for(i=0;i<length;i++)
{
sum=sum-start[i];
if(sum%2==1)
start[i]=1-start[i];
}
sum=0;
for(i=length-1;i>=0;i--)
{
cin>>finish[i];
sum=sum+finish[i];
}
for(i=0;i<length;i++)
{
sum=sum-finish[i];
if(sum%2==1)
finish[i]=1-finish[i];
}
memset(ko1,0,sizeof(ko1));
memset(ko2,0,sizeof(ko2));
for(i=0;i<length;i++)
{
if(start[i]==0)
continue;
int carry=0;
for(j=0;j<50;j++)
{
ko1[j]=ko1[j]+f[i][j]+carry;
carry=ko1[j]/10;
ko1[j]=ko1[j]%10;
}
}
for(i=0;i<length;i++)
{
if(finish[i]==0)
continue;
int carry=0;
for(j=0;j<50;j++)
{
ko2[j]=ko2[j]+f[i][j]+carry;
carry=ko2[j]/10;
ko2[j]=ko2[j]%10;
}
}
int flag=0;
for(i=49;i>=0;i--)
{
if(ko1[i]-ko2[i]>0)
flag=1;
if(ko1[i]-ko2[i]<0)
flag=2;
if(flag!=0)
break;
}
if(flag==0)
cout<<0<<endl;
else if(flag==1)
{
int length1;
for(i=0;i<50;i++)
ans[i]=ko1[i]-ko2[i];
for(i=0;i<50;i++)
if(ans[i]<0)
{
ans[i]=ans[i]+10;
ans[i+1]=ans[i+1]-1;
}
for(i=49;i>=0;i--)
if(ans[i]>0)
{
length1=i;
break;
}
for(i=length1;i>=0;i--)
cout<<ans[i];
cout<<endl;
}
else {
int length2;
for(i=0;i<50;i++)
ans[i]=ko2[i]-ko1[i];
for(i=0;i<50;i++)
if(ans[i]<0)
{
ans[i]=ans[i]+10;
ans[i+1]=ans[i+1]-1;
}
for(i=49;i>=0;i--)
if(ans[i]>0)
{
length2=i;
break;
}
for(i=length2;i>=0;i--)
cout<<ans[i];
cout<<endl;
}
}
return 0;
}