我们定义qsm函数是用来转进制的,枚举一下我们选的整数,从小到大枚举,然后用qsm把这个数转B1B2进制然后判断是否相等,每次取个min就行了,注意这里题目中虽然说是所有不超过
1
0
18
10^{18}
1018但是在计算过程中是有可能爆long long的,这是要注意的
#include<bits/stdc++.h>
using namespace std;
const long long inf=1e18;
long long B1,D1,B2,D2,l1,r1,l2,r2;
int main()
{
scanf("%lld%lld%lld%lld",&B1,&D1,&B2,&D2);
l1=1;
r1=1;
for(int i=1;i<D1;i++)
{
if(l1<inf/B1)
l1*=B1;
else
{
l1=inf+1;
break;
}
}
for(int i=1;i<=D1;i++)
{
if(r1<inf/B1)
r1*=B1;
else
{
r1=inf+1;
break;
}
}
l2=1;r2=1;
for(int i=1;i<D2;i++)
{
if(l2<inf/B2)
l2*=B2;
else
{
l2=inf+1;
break;
}
}
for(int i=1;i<=D2;i++)
{
if(r2<inf/B2)
r2*=B2;
else
{
r2=inf+1;
break;
}
}
l1=max(l1,l2);
r1=min(r1,r2);
if(l1<=r1)
printf("%lld\n",r1-l1);
else
printf("0\n");
return 0;
}